青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

2018年7月10日

幾個非常好的Opencv網(wǎng)站

posted @ 2018-07-10 05:49 wrh 閱讀(11626) | 評論 (0)編輯 收藏

2014年9月18日

解決方法:

ShowDropDown();之后SetCursor(LoadCursor(NULL, IDC_ARROW));即可
posted @ 2014-09-18 19:12 wrh 閱讀(1398) | 評論 (0)編輯 收藏

2013年3月17日

http://www.cvchina.info/codes/

http://www.tuicool.com/topics/11020052?st=0&lang=1&pn=1



OpenCV_基于局部自適應(yīng)閾值的圖像二值化


http://www.tuicool.com/articles/Mvqeui


一個很好的快速小波變換(FWT)源碼 C++的 http://www.codeproject.com/KB/graphics/2D_FWT_lib.aspx

很好用哦




posted @ 2013-03-17 20:53 wrh 閱讀(631) | 評論 (0)編輯 收藏

2013年2月27日

有時候下拉框(MFC標(biāo)準(zhǔn)叫組合框,CComboBox)中條目文本很多,超過了下拉框的寬度,如果不加設(shè)置的話,超過的部分文本將無法顯示,查找MSDN,發(fā)現(xiàn)解決方法,代碼如下:


代碼

// The pointer to my combo box.
    extern CComboBox* pmyComboBox;

    // Set the height of every item so the item
    // is completely visible.
    CString str;
    CSize   sz;
    int     dx=0;
    CDC*    pDC = pmyComboBox->GetDC();
    for (int i=0;i < pmyComboBox->GetCount();i++)
    {
        pmyComboBox->GetLBText( i, str );
        sz = pDC->GetTextExtent(str);

        // Only want to set the item height if the current height
        // is not big enough.
        if (pmyComboBox->GetItemHeight(i) < sz.cy)
            pmyComboBox->SetItemHeight( i, sz.cy );

        // Only want to set the item width if the current width
        // is not big enough.
        if (pmyComboBox->GetDroppedWidth() < sz.cx)
        {
            pmyComboBox->SetDroppedWidth(sz.cx + 20);
        }
    }
    pmyComboBox->ReleaseDC(pDC);

效果圖:



posted @ 2013-02-27 22:21 wrh 閱讀(1488) | 評論 (0)編輯 收藏

2012年7月15日

一、準(zhǔn)備工作
        這里我用到的平臺是 Microsoft Visual Studio 2008 和OpenCV2.0
        OpenCV2.0下載地址 http://www.opencv.org.cn/index.php/Download。安裝OpenCV2.0,假定安裝目錄為:D:Program FilesOpenCV2.0
        CMake下載地址 http://www.cmake.org/cmake/resources/software.html (選擇 Win32 Installer 安裝版本)。

二、編譯OpenCV
1. 用CMake導(dǎo)出VC++ 項(xiàng)目文件
■ 運(yùn)行cmake-gui,設(shè)置路徑為OpenCV安裝路徑(例如:D:\Program Files\OpenCV2.0),并創(chuàng)建子目錄 D:\Program Files\OpenCV2.0\vc2008,用于存放編譯結(jié)果。
■ 然后點(diǎn) configure,在彈出的對話框內(nèi)選擇 Visual Studio 9 2008。
■ Microsoft Visual Studio 2008 正式版支持OpenMP,所以ENABLE_OPENMP這個選項(xiàng)要勾上;如果是Express版本,則不支持OpenMP,所以需要取消ENABLE_OPENMP選項(xiàng)。
■ 最后再點(diǎn)擊Generate。



2. 編譯 OpenCV Debug 和 Release版本庫
完成上一步驟后,將在D:\Program Files\OpenCV2.0\vc2008目錄下生成OpenCV.sln的VC Solution File,請用VC++ 2008 Express打開OpenCV.sln,然后執(zhí)行如下操作:
■ 在Debug下,選擇Solution Explorer里的 Solution OpenCV,點(diǎn)右鍵,運(yùn)行"Rebuild Solution";如編譯無錯誤,再選擇INSTALL項(xiàng)目,運(yùn)行"Build"。
■ 在Release下,選擇Solution Explorer里的 Solution OpenCV,點(diǎn)右鍵,運(yùn)行"Rebuild Solution";如編譯無錯誤,再選擇INSTALL項(xiàng)目,運(yùn)行"Build"。
此時,OpenCV的*d.dll文件(for debug)和*.dll文件(for release)將出現(xiàn)在D:\Program Files\OpenCV2.0\vc2008\bin目錄中;OpenCV的*d.lib文件(for debug) 和*.lib文件(for release)將出現(xiàn)在D:\Program Files\OpenCV2.0\vc2008\lib目錄;頭文件*.h出現(xiàn)在D:\Program Files\OpenCV2.0\vc2008\include\opencv中。
至此Microsoft Visual Studio 2008 調(diào)用的OpenCV動態(tài)庫生成完畢。






三、配置Windows環(huán)境變量Path
將D:\Program Files\OpenCV2.0\vc2008\bin加入Windows系統(tǒng)環(huán)境變量Path中。
加入后,必須注銷當(dāng)前用戶或者重新啟動才能生效。


四、為Microsoft Visual Studio 2008 配置OpenCV環(huán)境
打開Microsoft Visual Studio 2008,菜單 Tools -> Options -> Projects and Solutions -> VC++ Directories。
■ Show directories for選擇include files,加入目錄 D:\Program Files\OpenCV2.0\vc2008\include\opencv
■ Show directories for選擇library files,加入目錄 D:\Program Files\OpenCV2.0\vc2008\lib

五、使用OpenCV 2.0 編程
以后每創(chuàng)建一個OpenCV 的Win32 控制臺程序,都需要添加依賴的庫
■ 選擇Solution Explorer里的 “項(xiàng)目名稱”,點(diǎn)擊鼠標(biāo)右鍵,選擇Properties;
■ 為項(xiàng)目的Debug配置增加依賴的庫:cxcore200d.lib cv200d.lib highgui200d.lib;
■ 為項(xiàng)目的Release配置增加依賴的庫:cxcore200.lib cv200.lib highgui200.lib

posted @ 2012-07-15 13:59 wrh 閱讀(768) | 評論 (0)編輯 收藏

2012年4月25日

1. 把你的虛擬網(wǎng)卡VMnet8(Win系統(tǒng)的網(wǎng)上鄰居里)設(shè)置為自動獲得IP、自動獲得DNS服務(wù)器,啟用。

 

 

2.

把你虛擬機(jī)中操作系統(tǒng)的Editing Auto Ethernet->IPV4 Setting 設(shè)置成如上圖所示。

有些Linux可以如下設(shè)置:“本地連接”也設(shè)置為自動獲得IP、自動獲得DNS服務(wù)器(在虛擬機(jī)中,右鍵“本地連接”-雙擊“Internet 協(xié)議”,看看是不是自動的吧!固定IP的也在這里改!)

 

 

3.當(dāng)然是將虛擬機(jī)的上網(wǎng)方式選為NAT咯。

 

 

右鍵你要設(shè)置的虛擬機(jī)選“設(shè)置”(因?yàn)橛械牟恢固摂M一臺),在“硬件”中選“以太網(wǎng)”, 將右邊的網(wǎng)絡(luò)連接改為NAT-確定。

 

 

4.點(diǎn)菜單欄里的“編輯”-選“虛擬網(wǎng)絡(luò)設(shè)置”,先將“自動橋接”給去掉(去掉鉤鉤),再選“DHCP”開啟DHCP服務(wù),點(diǎn)“開始”-應(yīng)用,再按同樣的方法開啟“NAT”的功能。

 

 

5.最重要的是你的兩個服務(wù)必須開啟:VMware DHCP ServiceVMware NAT Service

 

 

具體操作如下: 開始---設(shè)置--控制面板---管理工具---服務(wù),確保 VMware DHCP ServiceVMware NAT Service 服務(wù)已經(jīng)啟動

 

 

 

 

 

//====================================另外的方法

 

Ubuntu虛擬機(jī)共享主機(jī)上網(wǎng)
WinXP+VMware WorkStation+Ubuntu7.10

一.Bridged方式共享上網(wǎng)

1.設(shè)置Ubuntu的網(wǎng)絡(luò)連接方式為Bridged

2.共享ADSL連接
ADSL連接屬性中選中“Internet連接共享”,下拉列表中然后選擇“本地連接”,系統(tǒng)會自動把“本地連接”設(shè)置為192.168.0.1。注意此設(shè)置會在斷開連接并重啟后才生效

3.Ubuntu網(wǎng)絡(luò)設(shè)置

IP:192.168.0.X
網(wǎng)關(guān):192.268.0.1
DNS:192.168.0.1(系統(tǒng)->系統(tǒng)管理->網(wǎng)絡(luò)->DNS)

二.NAT方式共享上網(wǎng)

1.設(shè)置Ubuntu的網(wǎng)絡(luò)連接方式為NAT
2.開啟VMware DHCP Service和VMware NAT Service兩個服務(wù)
3.Ubuntu中網(wǎng)絡(luò)設(shè)置為自動配置(DHCP)或者手動設(shè)置IP及DNS

手動設(shè)置方法:

1.XP中ipconfig,得到VMnet8的IP為192.168.93.1

2.Ubuntu中設(shè)置網(wǎng)絡(luò)IP為192.168.93.X(X為3-254,網(wǎng)上很多人說只能是128-254,自動分配時一般也是128,但經(jīng)驗(yàn)證3-254都行,DNS設(shè)置為192.168.93.2

以上方法均經(jīng)驗(yàn)證,絕無多余步驟。

posted @ 2012-04-25 22:36 wrh 閱讀(743) | 評論 (0)編輯 收藏

2012年1月10日

1、 Dump文件放在哪里?

Dump文件不用非要放在你編譯出來的位置,你完全可以建立一個新的文件夾來放它。但若不是存放在編譯出來的位置,需要將編譯生成的PDB文件拷貝到Dump文件目錄,或是利用VS2005打開Dump文件后,設(shè)置PDB文件路徑。



2、 如何恢復(fù)當(dāng)時的現(xiàn)場?

可能你要問,怎么可能,這個dump文件可是用戶發(fā)給我的,我不可能去用戶家里調(diào)試吧?這個恢復(fù)現(xiàn)場可不是指的非要到那臺機(jī)器上去,而是要把產(chǎn)生dump文件對應(yīng)的二進(jìn)制文件拿到。

但是恢復(fù)現(xiàn)場需要所有的二進(jìn)制文件都要對應(yīng),你一定要有導(dǎo)致用戶崩潰的那些Exe和DLL。既然是你發(fā)布的程序,Exe文件當(dāng)然你會有。所以這里只考慮DLL就行了。

Dump文件中記錄了所有DLL文件的版本號和時間戳,所以你一定可以同過某種途徑拿到它。如果你能從用戶那里拿到最好,如果不方便,用戶不可能用的是我們平常不常用的操作系統(tǒng),所以找個有對應(yīng)系統(tǒng)的機(jī)器一般都會有。但是記住不僅是文件名稱要一致,還要核對版本和時間戳,如果不同一樣沒有辦法用。

如果客戶用了某個特殊的補(bǔ)丁怎么辦?

其實(shí)這個問題也很好解決,只要它不阻礙閱讀堆棧,就不用管它,調(diào)試Dump和運(yùn)行程序不一樣,缺少一兩個DLL沒有任何問題。



3、 如果真的需要怎么辦?

符號文件現(xiàn)在主要是指PDB文件。

如果沒有符號文件,那么調(diào)試的時候可能導(dǎo)致堆棧錯誤。

如果你丟失了這個發(fā)布版本中你編譯出來的那些exe和DLL的PDB,那么這個損失是嚴(yán)重的,重新編譯出來的版本是不能使用的。

我自己的DLL都有了,可是缺的是系統(tǒng)的DLL的對應(yīng)PDB文件怎么辦?圖1.4中已經(jīng)介紹了方法。微軟在它的符號數(shù)據(jù)庫上為我們提供了所有的PDB文件,還有部分非關(guān)鍵DLL。設(shè)置好后程序?qū)⒆詣酉螺d需要的PDB及DLL文件。



4、 拿到需要的文件了,這些文件應(yīng)該放在哪里?

符號數(shù)據(jù)庫中的文件不用動,把其它的exe和DLL、PDB文件放在dump文件目錄里就行了。



5、 我用的是VS2005,明明有源代碼,為什么顯示不了?

這個是dump調(diào)試的最頭痛問題,代碼可能已經(jīng)改過了,即使你從SVN拿到當(dāng)時的版本,時間戳也是錯的,VS2005就是不讓你顯示代碼。其實(shí)只要在

Tools/Options,Debugging/General中去掉

Require source files to exactly match the original version的復(fù)選就行了。
posted @ 2012-01-10 13:54 wrh 閱讀(2014) | 評論 (4)編輯 收藏

前言:利用drwtsn32或NTSD進(jìn)行程序崩潰處理,都可以生成可用于調(diào)試的dmp格式文件。使用VS2005打開生成的DMP文件,能很方便的找出BUG所在位置。本文將討論以下內(nèi)容:

1  程序編譯選項(xiàng)

2  利用VS2005 分析dump文件

3  常見問題討論

一、       程序編譯選項(xiàng)

PDB files contains all debug information like type definition and function prototype. When application crashes, we need the PDB files to analyze the root cause, so make sure these PDB files will be created when building it. You must do the following setting:

C/C++/General/Debug Information Format=Program Database (/Zi).

clip_image001

1.1 調(diào)試信息格式

Linker/Debugging/Generate Program Database File=”Name and location of your PDB files”

clip_image002

1.2 PDB文件輸出路徑

PDB文件路徑最好設(shè)置在同一個文件夾中,這樣方便dmp文件調(diào)試時調(diào)用。

調(diào)試時,所有的PDB文件和源文件必須嚴(yán)格匹配(the PDB files should be the one generated by build the source code),并存儲在一個安全的位置。當(dāng)客戶報告了一個錯誤時,你需要這些文件來幫忙以便定位錯誤于源代碼中并解決問題。

二、       VS2005 分析dump文件

In this simple application, there is an unhandled Access Violation Reading exception, because GetNameFromDatabase returns a NULL pointer, and this pointer is passed into IsPrefix and then it’s used directly without NULL pointer checking.

clip_image003

1.3 演示代碼

 

利用Release模式編譯該測試程序,在客戶機(jī)上運(yùn)行該程序,將根據(jù)NTSD設(shè)置生成相對應(yīng)的DMP格式文件。

可以使用Visual Studio.Net、NTSD或是其他的調(diào)試工具對DMP格式文件進(jìn)行分析。

 

l         Start Visual Studio.Net

Click File/Open Solution and make sure the files of type is *.dmp then click Open.

clip_image004

1.3 Open Dump File (GUI)

 

l         Set Symbol Path

Click Tools/Options, Debugging/Symbols,增加PDB文件路徑。若調(diào)試的程序需要微軟基礎(chǔ)庫的PDB信息,可以增加一個路徑為:

http://msdl.microsoft.com/download/symbols

在界面下方Cache Symbol From symbol…選擇本地存儲這些Symbols的路徑。

clip_image005

1.4 Symbol Path

如果DMP文件沒有放入本身PDB文件所在目錄,也可以在此處增加一個本地目錄。點(diǎn)OK后,VS2005將從網(wǎng)絡(luò)中下載所需要的Symbols,需要等待一段時間。如果是多次調(diào)試同一個程序錯誤所生成的DMP文件,可以在對話框中選擇“Search the above locations only when symbols are loaded manually”。從而可以節(jié)省網(wǎng)絡(luò)帶寬。

 

l         Set Source code path

Open Solution Property Pages and set the source code path.

clip_image006

1.5 屬性菜單

clip_image007

1.6 Debug Source Files

 

l         Start to Debug the Dump File

Click the Debug menu, it will ask you to save as a solution, save it. Then it will go to the line which caused the crash of your application.

clip_image008

1.7 調(diào)試窗口,定位到源代碼

 

三、       常見問題討論

1  Dump文件放在哪里?

Dump文件不用非要放在你編譯出來的位置,你完全可以建立一個新的文件夾來放它。但若不是存放在編譯出來的位置,需要將編譯生成的PDB文件拷貝到Dump文件目錄,或是利用VS2005打開Dump文件后,設(shè)置PDB文件路徑。參照圖1.4。

 

2  如何恢復(fù)當(dāng)時的現(xiàn)場?

可能你要問,怎么可能,這個dump文件可是用戶發(fā)給我的,我不可能去用戶家里調(diào)試吧?這個恢復(fù)現(xiàn)場可不是指的非要到那臺機(jī)器上去,而是要把產(chǎn)生dump文件對應(yīng)的二進(jìn)制文件拿到。

但是恢復(fù)現(xiàn)場需要所有的二進(jìn)制文件都要對應(yīng),你一定要有導(dǎo)致用戶崩潰的那些ExeDLL。既然是你發(fā)布的程序,Exe文件當(dāng)然你會有。所以這里只考慮DLL就行了。

Dump文件中記錄了所有DLL文件的版本號和時間戳,所以你一定可以同過某種途徑拿到它。如果你能從用戶那里拿到最好,如果不方便,用戶不可能用的是我們平常不常用的操作系統(tǒng),所以找個有對應(yīng)系統(tǒng)的機(jī)器一般都會有。但是記住不僅是文件名稱要一致,還要核對版本和時間戳,如果不同一樣沒有辦法用。

如果客戶用了某個特殊的補(bǔ)丁怎么辦?

其實(shí)這個問題也很好解決,只要它不阻礙閱讀堆棧,就不用管它,調(diào)試Dump和運(yùn)行程序不一樣,缺少一兩個DLL沒有任何問題。

 

3  如果真的需要怎么辦?

符號文件現(xiàn)在主要是指PDB文件。

如果沒有符號文件,那么調(diào)試的時候可能導(dǎo)致堆棧錯誤。

如果你丟失了這個發(fā)布版本中你編譯出來的那些exe和DLL的PDB,那么這個損失是嚴(yán)重的,重新編譯出來的版本是不能使用的。

我自己的DLL都有了,可是缺的是系統(tǒng)的DLL的對應(yīng)PDB文件怎么辦?圖1.4中已經(jīng)介紹了方法。微軟在它的符號數(shù)據(jù)庫上為我們提供了所有的PDB文件,還有部分非關(guān)鍵DLL。設(shè)置好后程序?qū)⒆詣酉螺d需要的PDB及DLL文件。

 

4  拿到需要的文件了,這些文件應(yīng)該放在哪里?

符號數(shù)據(jù)庫中的文件不用動,把其它的exe和DLL、PDB文件放在dump文件目錄里就行了。

 

5  我用的是VS2005,明明有源代碼,為什么顯示不了?

這個是dump調(diào)試的最頭痛問題,代碼可能已經(jīng)改過了,即使你從SVN拿到當(dāng)時的版本,時間戳也是錯的,VS2005就是不讓你顯示代碼。其實(shí)只要在

Tools/OptionsDebugging/General中去掉

Require source files to exactly match the original version的復(fù)選就行了。

posted @ 2012-01-10 13:53 wrh 閱讀(865) | 評論 (0)編輯 收藏

2011年10月21日

映射表類(CMap)是MFC集合類中的一個模板類,也稱作為“字典”,就像一種只有兩列的表格,一列是關(guān)鍵字,一列是數(shù)據(jù)項(xiàng),它們是一一對應(yīng)的。關(guān)鍵字是唯一的,給出一個關(guān)鍵字,映射表類會很快找到對應(yīng)的數(shù)據(jù)項(xiàng)。映射表的查找是以哈希表的方式進(jìn)行的,因此在映射表中查找數(shù)值項(xiàng)的速度很快。映射類最適用于需要根據(jù)關(guān)鍵字進(jìn)行快速檢索的場合,我們的程序中就用映射表來保存計(jì)時器標(biāo)志值和類實(shí)例指針,用計(jì)時器的標(biāo)志值作為關(guān)鍵字。 他這個有點(diǎn)像數(shù)組,比如你要查找a[index],不必先遍歷前面的index個元素,只不過數(shù)組的下標(biāo)是哈希表鍵值,它是以鍵值對的形式出現(xiàn)的。舉個例子來說吧,公司的所有職員都有一個工號和自己的姓名,工號就是姓名的關(guān)鍵字,給出一個工號,就可以很快的找到相應(yīng)的姓名。
        舉例如下:
1、定義一個CMAP,向這個CMAP中增加數(shù)據(jù)項(xiàng)(鍵-值對)。
CMap<CString, LPCTSTR, CString, LPCTSTR>m_ItemMap;
CString strKey = _T(""), str = _T("");
int i;
for(i = 0; i < 5; i++)
    {
        strKey.Format("%d", i);             
//這個是鍵
        str.Format("A%d", i);              
//鍵對應(yīng)的
        m_ItemMap.SetAt(strKey, str);
    }
2、遍歷正個CMAP的常用方法。
    POSITION pos = m_ItemMap.GetStartPosition();
    while(pos)
    {
        m_ItemMap.GetNextAssoc(pos, strKey, str);
        cout<< strKey<< ":"<< str<< endl;
    }
3、在CMAP中查找相應(yīng)的數(shù)據(jù)項(xiàng)。
    CString pReset;
    if(m_ItemMap.Lookup("1", pReset))
    {
        cout<<pReset<<endl;
    }


=======================================================================現(xiàn)在,我們來學(xué)習(xí)MFC中,最常用的數(shù)據(jù)結(jié)構(gòu)中的最后一個CMap模板。之前,我們已經(jīng)依次學(xué)完了CArray,CList,并且也對它們進(jìn)行了初步的剖析。

其實(shí),我一直認(rèn)為CMap是最簡單的一個數(shù)據(jù)類型,如果說,大家對這個數(shù)據(jù)類型產(chǎn)生不良感覺的話,大多是因?yàn)閷ash表的陌生。

顯然,CMap就是對Hash表的一種實(shí)現(xiàn)。對于Hash表來說,我們需要提供成對的Key與Value進(jìn)行操作,其實(shí),也就是將我們?nèi)粘J褂玫臄?shù)組下標(biāo)替換成現(xiàn)在Key,至于MFC是采用了什么樣的散列函數(shù),我們不必知道。

Hash表可以認(rèn)為是數(shù)組的一種優(yōu)化,或者說是對數(shù)組缺陷的一種彌補(bǔ),因?yàn)槲覀冎溃瑪?shù)組在具備了高效存取性能的同時,無法動態(tài)的調(diào)整自身的大小,又嚴(yán)重的影響了它的使用效果。這給了Hash表可乘之機(jī),Hash表總是使用了某種算法盡可能的來達(dá)到將成對的元素存儲到一個額定的離散的內(nèi)存空間,它既繼承了鏈表對自身的動態(tài)調(diào)整,又盡可能的使讀寫維持在高速的水平,當(dāng)然無論如何還是要比數(shù)組慢的多。

如果你非要讓我告訴你,Hash表是什么樣的一個數(shù)據(jù)結(jié)構(gòu)的話,很遺憾,我無法準(zhǔn)確的描述,這就相當(dāng)于你問我“鳳凰是什么樣子”,不過我可以告訴你孔雀的樣子。常用的Hash表非常像一個十字?jǐn)?shù)組,似乎十字?jǐn)?shù)組又成為了眾多讀者的障礙,如果你暫時還不能理解的話,請你去翻閱Hash表的詳細(xì)論述,當(dāng)然你也可以在不久之后,在本處看到這些經(jīng)典數(shù)據(jù)結(jié)構(gòu)的精講。

現(xiàn)在,我們來看一個CMap的用法,至于它的參數(shù),你可以看本空間一篇專門描述CArray,CList以及CMap參數(shù)用法的文章《CArray,CList,CMap如何實(shí)化(實(shí)例化)》。下面是我自己編寫的例子:

class Point

{

public:

    Point()

    {

        m_x = 0;

        m_y = 0;

    }

    Point(int x, int y)

    {

        m_x = x;

        m_y = y;

    }

public:

    int m_x;

    int m_y;

};

typedef CMap<const char*, const char*, Point, Point&>     CMapPnt; //請?jiān)谑褂弥岸x

int main()

{

    Point elem1(1, 100), elem2(2, 200), elem3(3, 300), point;

    CMapPnt mp;

    // insert 3 elements into map          #1

    mp.SetAt("1st", elem1);

    mp.SetAt("2nd", elem2);

    mp.SetAt("3th", elem3);

   

    // search a point named "2nd" from map                  #2

    mp.Lookup("2nd", point);

    printf("2nd: m_x: %d, m_y: %d\n", point.m_x, point.m_y);

// insert a new pair into map      #3

Point elem4(4, 400);

mp["4th"] = elem4;

cout<<"count: "<<mp.GetCount()<<endl;

// traverse the entire map                    #4

size_t index = 0;

const char* pszKey;

POSITION ps = mp.GetStartPosition();

while( ps )

{  

mp.GetNextAssoc(ps, pszKey, point);

printf("index: %d, m_x: %d, m_y: %d\n", ++index, point.m_x, point.m_y);

}

return 0;

}

代碼中,我已經(jīng)給出了一些注釋,我同樣建議讀者們,用英文在代碼中注釋,這樣的好處實(shí)在是太多了。尤其在代碼需要在不同編碼的操作系統(tǒng)上調(diào)試的時候。

對于CMap這個類,我不得不著重啰嗦一下的是:遍歷操作以及取下標(biāo)【】操作,當(dāng)然還有那個令很多人困惑不已的ARG_KEY到底應(yīng)該如何選擇的問題。

遍歷,看注釋#4,至于POSITION的含義,請?jiān)诒究臻g,查看其它文章。先使用GetStartPosition()函數(shù)獲得表頭的位置,然后,我們可以使用GetNextAssoc函數(shù)來遍歷。GetNextAssoc(POSITION& rNextPosition, KEY& rKey, VALUE& rValue)函數(shù)的參數(shù)值得說明一下,大家看到,3個參數(shù)都是引用,而第一個是rNextPosition,顧名思義,在函數(shù)返回之后,它將會指像下一個元組,當(dāng)然這是在表還未遍歷完的時候,否則,它將被置為空(NULL)。

【】,利用下標(biāo)取元素的這個操作符,在CMap中被重載,用來返回指定Key值數(shù)據(jù)的引用,不過在注釋#3處,對于先取"4th"這個Point的引用然后賦值的用法,看起來,似乎有點(diǎn)聰明過了頭,因?yàn)樵谶@之前,我們還沒有插入"4th"所對應(yīng)的元組,但是,程序卻能正常的運(yùn)行!為什么?其實(shí),這樣的用法是十分正確的,因?yàn)镃Map畢竟不是數(shù)組,它是沒有邊界的,當(dāng)CMap在獲得一個它無法查詢到的Key值的時候,它會將這個Key以及一個空的數(shù)據(jù)類型追加到Hash表中去,從而保證了上面的程序可以無誤的運(yùn)行。

我們已經(jīng)說過,ARG_KEY是作為類型參數(shù)傳入CMap的,但并不是任何類型都可以作為ARG_KEY傳入的。為什么?看樣子,這次不得不簡單的說說Hash表的散列函數(shù)了。每個Hash表,總會使用一些散列函數(shù),用來查找Key所對應(yīng)的Value,理想狀態(tài)下,我們當(dāng)然希望Hash表,就是一個數(shù)組,雖然這不可能,不過這樣理解,可以幫助我們更好的理解Hash表的物理結(jié)構(gòu),就讓我們暫時把它看成一個數(shù)組吧。數(shù)組總是使用下標(biāo)來直接獲取元素的存儲地址,而下標(biāo),顯然應(yīng)該是個非負(fù)整數(shù),從而Hash表,也應(yīng)該具備這樣的特性,至少必須存在某種算法可以使傳入的Key可以直接的轉(zhuǎn)化為一個非負(fù)的整數(shù),這也就是ARG_KEY的選擇標(biāo)準(zhǔn)。從而對象、引用無論如何都不應(yīng)該作為ARG_KEY成為CMap的類型參數(shù),而int、unsigned int、指針以及地址就成為了ARG_KEY的常用類型參數(shù),其實(shí)也就是那些類似于整型的數(shù)據(jù)類型。常常看到一些人在用CMap的時候,試圖使用CString作為CMap中ARG_KEY的類型參數(shù),這是應(yīng)該被糾正的方向性錯誤,但有些人似乎會理直氣壯的反駁我,因?yàn)樗麄儼l(fā)現(xiàn)類型參數(shù)KEY是可以使用CString的,這很奇怪嗎?我說過KEY不能使用CString嗎?之所以KEY可以使用CString而ARG_KEY卻用的是LPCTSTR,那是因?yàn)镃String重載了operator==(const char*)這個判等操作符,當(dāng)CMap從Hash表中獲得KEY之后,它會將ARG_KEY與KEY直接相比較。真正存于CMap內(nèi)部的是KEY,也就是CString。這也就是為什么,我們經(jīng)常會看到CMap被實(shí)化成CMap<CString, LPCTSTR/*相當(dāng)于const char*,非Unicode情況下*/, CString,CString&>這樣的一個四不像實(shí)化類的原因,至于CMap的效率優(yōu)化問題,我們會在以后的文章中繼續(xù)與大家探討。

CMap的確是個很不錯的數(shù)據(jù)結(jié)構(gòu),尤其在你建立一個字典的時候。比如idealsoft的含義是"曳光科技",這就是一個元組,也就是一個Pair,Key是"idealsoft",而Value是"曳光科技"。

====================================================================
#include   <afxwin.h>
#include   <afxtempl.h>
void   main()
{
AfxWinInit(::GetModuleHandle(NULL),   NULL,   ::GetCommandLine(),   0);
CMap <int,   int,   CString,   CString>   m_cMap;
m_cMap.SetAt(9923033,     "張三 ");
m_cMap.SetAt(9826033,     "張A ");
m_cMap.SetAt(9923063,     "張B ");
m_cMap.SetAt(9923093,     "張C ");
CString   strName;
m_cMap.Lookup(9923063,   strName);
AfxMessageBox(strName);
}


posted @ 2011-10-21 09:38 wrh 閱讀(19244) | 評論 (0)編輯 收藏

2011年8月26日

COLORMAP   ColorMap[3]   =   {  
{   RGB(128,128,128),   ::GetSysColor(COLOR_BTNSHADOW)   },  
{   RGB(192,192,192),   ::GetSysColor(COLOR_BTNFACE)   },  
{   RGB(255,255,255),   ::GetSysColor(COLOR_BTNHILIGHT)}  
};  

CBitmap   Bitmap;  
Bitmap.LoadMappedBitmap(IDB_BITMAP,   0,   ColorMap,   3);


BOOL   LoadMappedBitmap(
                UINT   nIDBitmap,                               //位圖的標(biāo)識
                UINT   nFlags   =   0,                     //通常情況下為0,當(dāng)將該位圖作
        為屏蔽位圖使用時該參數(shù)為CMB_MASKED
                LPCOLORMAP   lpColorMap   =   NULL,  
                int   nMapSize   =   0);

【返回值】該成員函數(shù)調(diào)用成功返回一個非零值,否則返回零。
【參   數(shù)】
        nIDBitmap
           
      nFlags

通常情況下為0,當(dāng)將該位圖作為屏蔽位圖使用時該參數(shù)為CMB_MASKED。

lpColorMap

一個指向COLORMAP數(shù)據(jù)類型數(shù)組的指針。COLORMAP的數(shù)據(jù)結(jié)構(gòu)如下:

typedef   struct   _COLORMAP{

COLORREF   from;   //   邏輯調(diào)色板的顏色

COLORREF   to;   //   物理調(diào)色板的顏色

}COLORMAP,   FAR*   LPCOLORMAP;

nMapSize

指定數(shù)組中數(shù)組元素的個數(shù)。

【注   釋】本成員函數(shù)可以將一個設(shè)備無關(guān)位圖裝入CBitmap類的對象,并根據(jù)邏輯調(diào)色板與物理調(diào)色板的映射關(guān)系使系統(tǒng)正確地顯示該位圖。


_COLORMAP   iColor[2]={{RGB(191,191,196),::GetSysColor(COLOR_3DFACE)},{RGB(192,192,192),::GetSysColor(COLOR_3DFACE)}};
m_bmToolbarHi.LoadMappedBitmap(   IDB_TOOLBARHI,0,iColor,2);
        m_wndToolBar.SetBitmap(   (HBITMAP)m_bmToolbarHi   );
這是我的代碼,可他不工作啊:~(

有個問題提醒一下:
庫中的LoadMappedBitmap函數(shù)對超過256色的圖像好像無效,而且會死掉。
對不超過256色的圖像是有效的。

我知道了,我的圖像是256色的,這不錯。但是轉(zhuǎn)換的顏色好像也算一種顏色。我把我導(dǎo)出的圖像色數(shù)改成128,結(jié)果就好了   :D

posted @ 2011-08-26 14:59 wrh 閱讀(2417) | 評論 (0)編輯 收藏
僅列出標(biāo)題  下一頁

導(dǎo)航

<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

統(tǒng)計(jì)

常用鏈接

留言簿(19)

隨筆檔案

文章檔案

收藏夾

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品亚洲人在线观看| 久久久综合激的五月天| 欧美日韩在线视频一区二区| 亚洲高清资源| 久久先锋资源| 亚洲日本成人| 中文精品视频| 国产欧美1区2区3区| 亚洲欧美中文字幕| 免费不卡在线视频| 一本色道久久综合精品竹菊| 国产精品入口66mio| 国产精品久久| 欧美电影免费观看高清完整版| 免费观看一级特黄欧美大片| 免费视频一区| 另类综合日韩欧美亚洲| 亚洲午夜精品久久| 黑人极品videos精品欧美裸| 欧美va亚洲va香蕉在线| 欧美第十八页| 国产精品久久久久久久久久三级| 久久一区二区三区四区五区| 99热精品在线| 亚洲一区二区三区在线| 久久影院午夜论| 亚洲精品日产精品乱码不卡| 欧美伊久线香蕉线新在线| 久久精品视频免费观看| 亚洲电影在线免费观看| 欧美日韩1080p| 久久久av水蜜桃| 亚洲美女诱惑| 欧美激情四色 | 亚洲精品黄色| 亚洲欧美日韩一区| 国产精品久久久久久模特| 亚洲欧洲一区二区三区| 国产精品一区二区久久久| 国产日本欧美一区二区| 亚洲精品乱码久久久久| 久久综合色影院| 欧美自拍偷拍| 亚洲大胆人体视频| 一区二区三区毛片| 久久精品欧洲| 久久综合婷婷| 一本一本久久| 亚洲欧美日韩一区在线| 韩日欧美一区二区三区| 欧美99在线视频观看| 一区二区三区www| 一区二区欧美激情| 国产乱码精品一区二区三| 欧美精品三级日韩久久| 国产欧美一区二区三区国产幕精品| 欧美成人一区二区在线| 在线观看国产日韩| 亚洲欧美一区二区三区久久| 美女在线一区二区| 欧美国产日韩视频| 国内精品视频一区| 午夜精品电影| 欧美久久久久久| 在线日韩欧美视频| 亚洲欧美日韩在线高清直播| 在线观看亚洲a| 亚洲一区二区影院| 国产精品对白刺激久久久| 鲁大师影院一区二区三区| 欧美色精品天天在线观看视频| 狠狠久久亚洲欧美专区| 亚洲免费精品| a91a精品视频在线观看| 欧美成人午夜激情| 美女日韩在线中文字幕| 国产欧美精品在线| 亚洲一区二区三区高清| 一区二区三区欧美在线观看| 欧美大胆a视频| 亚洲人成啪啪网站| 亚洲图片你懂的| 欧美激情1区2区3区| 亚洲高清不卡一区| 99国产精品久久久久久久| 欧美区一区二| 亚洲欧美成人一区二区在线电影| 午夜视频一区在线观看| 激情久久综艺| 9色精品在线| aa日韩免费精品视频一| 一区二区精品在线| 欧美黄色大片网站| 亚洲视频一区二区| 一本色道久久88亚洲综合88| 国产精品videosex极品| 久久蜜桃资源一区二区老牛| 欧美国内亚洲| 午夜伦欧美伦电影理论片| 看欧美日韩国产| 亚洲资源在线观看| 国产精品福利在线| 久久中文字幕导航| 亚洲在线视频免费观看| 欧美~级网站不卡| 亚洲一区二区三区涩| 亚洲国产导航| 在线不卡免费欧美| 国产欧美综合在线| 国产精品久久久久婷婷| 蜜臀久久久99精品久久久久久| 国产精品日韩精品| 欧美精品在线一区| 毛片精品免费在线观看| 久久激情综合| 亚洲日本成人网| 91久久精品国产91性色| 曰韩精品一区二区| 国产欧美日韩一区| 国产亚洲电影| 亚洲成人在线视频播放 | 亚洲免费在线观看视频| 欧美激情精品久久久久久变态| 欧美专区亚洲专区| 国产精品视频网| 国产伦精品一区二区三区四区免费 | 欧美一区二区三区免费观看视频| 国产精品v欧美精品v日本精品动漫| 欧美freesex交免费视频| 久久露脸国产精品| 亚洲第一综合天堂另类专| 亚洲黑丝一区二区| 久久久久国产精品人| 亚洲成人自拍视频| 亚洲精品欧美| 久久激情五月婷婷| 亚洲国产另类精品专区 | 亚洲福利视频在线| 在线观看91精品国产入口| 9l国产精品久久久久麻豆| 中国成人在线视频| 免播放器亚洲一区| 亚洲一区二区三区久久| 欧美国产日韩视频| 最新日韩av| 蜜臀91精品一区二区三区| 亚洲一区免费观看| 欧美视频免费看| 日韩午夜在线播放| 亚洲二区在线| 久久综合色综合88| 在线电影院国产精品| 久久人人97超碰国产公开结果 | 狠狠色丁香婷综合久久| 亚洲第一视频网站| 欧美成人官网二区| 久久人人看视频| 在线观看欧美日本| 免费成人美女女| 久久午夜电影| 亚洲精品日韩欧美| 亚洲精品久久久蜜桃| 欧美精品亚洲一区二区在线播放| 久久久久久电影| 狠狠色伊人亚洲综合成人| 亚洲欧美日韩精品久久| 亚洲天堂成人在线观看| 欧美中文字幕在线| 韩国女主播一区| 亚洲国产精品悠悠久久琪琪| 欧美激情久久久久| 欧美一区二区三区免费看| 亚洲国产一区二区三区青草影视 | 99在线热播精品免费99热| 欧美不卡在线视频| 亚洲一区二区在线| 亚洲欧美激情精品一区二区| 国产伊人精品| 夜夜夜久久久| 亚洲日本中文字幕| 欧美亚洲尤物久久| 一区二区三区欧美日韩| 久久大逼视频| 欧美在线免费| 国产精品户外野外| 最新国产精品拍自在线播放| 国内精品一区二区| 性做久久久久久免费观看欧美| 欧美精品激情blacked18| 久久蜜桃精品| 国产精品一级| 午夜精品久久久久久| 亚洲男人影院| 欧美久久在线| 亚洲美女区一区| 欧美极品欧美精品欧美视频| 欧美成人免费观看| 欧美日韩国产999| 亚洲日韩成人| 欧美亚洲一区在线|