?? 04.1.1 classwizard.txt
字號:
4.1.1 ClassWizard
為了給視類添加鼠標左鍵按下消息的響應,讀者可以像前面對框架類添加消息響應那樣進行操作,但這里,再為讀者介紹一種給類添加消息響應的方法,即利用ClssWizard工具來實現。 ClassWizard是Visual C++ 6.0中一個很重要的組成部分。它可以幫助我們創建一個新類,為己有類添加成員變量,添加消息和命令的響應函數,以及虛函數的重寫。在 VC++開發環境界面中,打開【View】菜單,選擇【ClassWizard】菜單命令,這時會彈出如圖4.1所示的對話框。
圖 4.1 MFC ClassWizard對話框
可以看到, MFC Class Wizard對話框包括五個選項卡,分別是: Message Maps、 Member Variables、 Automation、 ActiveXEvents和ClassInfo選項卡。下面就分別介紹這五個選項卡。
1. Message Maps選項卡
Message Maps選項卡的界面如圖4.1所示,可以通過此選項卡添加消息處理函數、成
員函數及新類,還可以刪除成員函數,以及對成員函數進行編輯。該選項卡上各控件的含義及作用如下所述。
. Project下拉列表框給出當前工程名稱。實際上,對 VC++來說,一個工作區空間
C.dsw)中可以包含多個工程C.dsp)。因此,如果工作區中有多個工程,可以在Project
下拉列表框選擇當前需要處理的工程。
. Class name下拉列表框顯示當前工程中包含的類,用戶可以選擇任何存在于當前工
程中的類,為其添加消息處理函數等。
. Object IDs列表框列出當前選擇的類所包含的所有資源的ID號,包括菜單項、對
話框控件等,列表中的第一項總是當前的類名。
. Messages列表框列出對應于ObjectIDs框中所選中的當前項可處理的ID,以及針
對當前類可被重寫的MFC虛函數。
. Member functions列表框列出當前類包含的所有成員函數。其中,前面標注有 "V"
字符的是虛函數,標注 "W"字符的是Windows消息處理函數。
. Add Class按鈕允許用戶在工程中添加一個新類。新類可以是自己創建的,也可以
從ActiveX庫中選取。
. Add Function按鈕允許用戶向 Member Functions列表框中添加一個新的消息處理
函數或重載基類的虛函數。
. Delete Function按鈕允許用戶刪除Member Functions列表框中所選中的函數。
. Edit Code按鈕打開編輯窗口,允許用戶對Member Functions框中所選中的項進行
編輯。
2. Member Variables選項卡
單擊 MFC ClassWizard對話框上的 Member Variables標簽,即可顯示 Member Variables 選項卡,如圖 4 .2所示。通過此選項卡,我們可以加入與對話框上的控件相關聯的成員變量,以便程序利用這些成員變量與對話框上的控件進行信息交換。至于如何將變量與控件相關聯,將在后面的章節中詳細介紹,這里只對該選項卡上各控件的含義做簡單介紹。
圖 4.2 MFC ClassWi zard對話框之 Member Variables選項卡
. Project下拉列表框與 Message Maps選項卡上的 Project下拉列表框含義相同,給出當前工程名稱。
. Class name下拉列表框與 Message Maps選項卡上的 Class name下拉列表框,顯示當前工程中包含的類,用戶可以從中選擇當前要操作的類。
. Control IDs 項顯示對話框中所具有的控件的 E號; Ty pe項表示成員變量的類型: Member項表示成員變量的名字。
. Add Class按鈕允許用戶在工程中添加一個新類。新類可以是自己創建的,也可以從 ActiveX庫中選取。
. Add Variable按鈕用于給選定的控件添加成員變量。
. Delete Variable按鈕用于刪除選定控件的成員變量。
. Update Columns:當數據源中的表結構發生變化時,單擊此按鈕,即可更新相應的記錄集類,以便與最新的表結構保持一致。
. Bind All按鈕用于把數據庫內指定表中的字段與記錄集類相應數據成員一一綁定。默認情況下, ClassWizard基于每個字段的名稱確定記錄類內相應的數據成員名稱。
3. Automation選項卡
單擊 MFC ClassWizard對話框上的 Automation標簽,即可顯示 Automation選項卡,如圖 4.3所示。此選項卡允許用戶加入方法或屬性,以增強程序的 Automation功能。
. Project下拉列表框給出當前工程名稱。
圖 4.3 MFC ClassWizard對話框之 Automation選項卡
. Class name下拉列表框顯示當前工程中包含的類,用戶可以選擇任何存在于當前工程中的類,包括不支持 Automation的類。
. Extemal names列表框列出己加到當前類中的方法及屬性的外部名。這些名字供 Automation客戶程序使用。
. Implementation文本框顯示 External names框中選中的方法及屬性在 C++類中是怎樣實現的: S表示固有屬性, C表示自定義屬性, M表示方法,粗體表示默認的屬性。
. Add Class按鈕允許用戶在工程中添加一個新類。新類可以是自己創建的,也可以從 ActiveX庫中選取。
. Add Method按鈕用于給類添加新的 Automation方法。增加或刪除方法時, Class Wizard自動更新映射表。此項只對支持 Automation的類有效。
. Add Property按鈕用于給類添加新的 Automation屬性。增加或刪除屬性時, Class Wizard自動更新映射表,此項只對支持 Automation的類有效。
. Delete按鈕用于刪除 Extem aJ names框中選定的方法或屬性名。如果屬性是用 GetJSet方式訪問的,必須手工刪除 .cpp文件里的 Get和 Set成員函數。
. Edit Code按鈕打開編輯窗口進行編輯。
. Data Binding按鈕用于指定 Automat.on控件支持的數據綁定層次。
4. ActiveX Events選項卡
單擊 MFC ClassWizard對話框上的 ActiveX Events標簽,即可顯示 ActiveX Events選項卡,如圖 4.4所示。該選項卡允許用戶加入事件以支持 ActiveX控件。
. Project下拉列表框給出當前t程名稱。
. Class name下拉列表框顯示當前工程中包含的類,用戶可以選擇任何存在于當前工程中的類,包括不支持 ActiveX的類。
. ExtemaJ names列表框列出己加到當前類中的成員函數與成員變量名。這些名字供 Automation客戶程序使用。
圖 4.4 MFC ClassWizard對話框之ActiveX Events選項卡
. Implementation文本框顯示Extemal names框中選中的方法及屬性在 C++類中的實
現: S表示固有屬性,C表示自定義屬性,M表示方法,粗體表示默認的屬性。
. Add Class按鈕允許用戶在工程中添加一個新類。新類可以是自己創建的,也可以從ActiveX庫中選取。
. AddEvent按鈕允許用戶加入Automation事件。該事件用于類與該類容器之間的通信。
. Delete按鈕用于刪除選中的 Automation事件。
5. Class Info選項卡
單擊MFC ClassWizard對話框上的ClassInfo標簽,即可顯示ClassInfo選項卡,如圖
4.5所示。通過此選項卡,用戶可以觀察當前工程中類的有關信息。
圖4.5 MFC ClassWizard對話框之Class Info選項卡
106 I ~如'
VCII:深λ詳解
. Project下拉列表框給出當前工程名稱。
. Class name下拉列表框顯示當前工程中包含的類。用戶可以選擇當前需要處理的類。
. File details顯示當前類的文件及資源 ID號等信息。
. Advanced options控件組包含下列信息:
. Message filter下拉列表框,列出對當前選中的類有效的所有消息分類,這里是按照消息所屬窗口或對話框類型進行分類的。
. Foreign class下拉列表框的內容由當前選中類的類型決定。如果當前選中的類是對話框、有格式視圖或記錄集視圖,那么此框列出所有與選中的類相關聯的外部類名。在其他情況下,則顯示為 None。
. Foreign variable框列出與當前選中的類相關的所有外部變量。此選項一般用于數據庫類。在編輯記錄集視圖時,可以選取相關的記錄集,并可以輸入一個新的變量名。
. Add Class按鈕用于添加新類。
現在我們利用 Class Wizard給工程 Draw的視類 CDrawView添加 WM LBUTTONDOWN消息響應函數,在 MFC ClassWizard對話框的 Message Maps選項卡上依次進行以下選擇。
. Project選項
選擇工程名,因為本例的工作區中只有一個工程,即 Draw,所以直接選擇這個工程即可。
. Class name選項
選擇 CDrawView類。
. Object IDs選項因為我們現在是要對 CDrawView類添加消息響應函數,所以應該選擇 CDrawView J頁。
. Messages選項拖動此選項的該動條,找到 WM_LBUTTONDOWN消息并選中。經過以上幾步選擇之后,單擊 Add Function按鈕, ClassWizard就會在 member functions
列表框中添加一項,即 WM_LBUTTONDOWN消息的響應函數 OnLButtonDown,如圖 4.6所示。
單擊 Edit Code按鈕,即可跳轉到 CDrawView類的源文件中,并定位于 OnLButtonDown函數的定義處。與前面 CMainFrame類的處理一樣,在此函數中添加一個顯示消息框的函數,代碼如例 4-2所示。
仔tl4-2
void CDrawView: :OnLButtonDown(UINT nFlags , CPoint point)
// TODO: Add your message handler code here and/or call default
MessageBox("View Clicked!");
CView: :OnLButtonDown(nFlags , point);
"
圖 4.6新增的WM LBUTTONDOWN消息響應函數項
Build并運行Draw程序,然后在程序窗U上單擊鼠標左鍵,此時會彈出一個消息框(如圖4.7所示〉。這就說明視類所代表的窗口被單擊了。也就是說,視類捕獲鼠標左鍵按下消息這一操作生效了。
圖 4.7 B蜻在視類中捕獲 WM_LBUTTONDOWN 旦消息時程序運行結果
那么為什么前面在框架類中捕獲這一消息就沒有生效呢?在前面第 3章中講述文檔/視類結構時,曾說過視類窗口始終覆蓋在框架類窗口之上。我們可以打個比方,框架窗口就像一面墻,而視類窗口就像墻紙,它始終擋在這面墻的前面。那么此時對這面墻的所有操作,其實都是在這面墻紙上進行的。同樣的道理也適用于框架窗口和視窗口。也就是說,所有操作,包括鼠標單擊、鼠標移動等操作都只能由視類窗口捕獲。這就是為什么在框架類窗口中收不到鼠標左鍵單擊這一消息的原因。
這時,我們可以刪除框架類中已經添加的 WM一LBUTIONDOWN這一消息的響應函數。不過,讀者應注意的是,通過MFC提供的向導添加消息響應函數后, ClassWizard會在所選類的頭文件和源文件中添加幾處相關的信息, 4. 1.2節將介紹通過向導添加的內容及其所在的位置。因此刪除某個消息響應函數時要小心,一定要確保這幾處相關代碼均被刪除。最好不要直接手工刪除源代碼中的函數定義??梢栽贑lassView選項卡上用鼠標右鍵單擊要刪除的函數名,在彈出的快捷菜單中選擇【Delete】菜單命令,如圖4.8所示。系統會提示用戶是否確認此操作,當用戶做出肯定應答后, VC++就會把頭文件和源文件中所有與此函數相關的信息全部刪除。
圖4.8刪除一個類成員函數的操作
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -