MFC 對話框編程要點
(一)對話框基本要點和生命周期
MFC對話框支持WYSIWYG編程模式,即What you see is what you get.。其類型分為模式對話框和非模式對話框
對話框由一個rc資源文件描述外觀;與一個cpp類相連接(通過ID);對話框內(nèi)的控件使用基于ID的變量映射來通訊。
模式對話框對象被定義后,通過調(diào)用DoModal()函數(shù)來顯示對話框并進(jìn)行相關(guān)操作,此函數(shù)當(dāng)對話框被關(guān)閉時返回。其返回值標(biāo)明了對話框是點擊OK退出(1),還是被Cancel(2)。
非模式對話框需要與某個View相關(guān)聯(lián),以便對話框退出時發(fā)送消息給對應(yīng)的View進(jìn)行必要的處理。
在對話框顯示前,系統(tǒng)會調(diào)用OnInitDialog()函數(shù),在這個函數(shù)中你可以設(shè)置一些控件屬性,進(jìn)行一些初始化工作。比如,設(shè)置滾動條的最大最小值,設(shè)置List列表的初始值等。其方法是將控件ID作為參數(shù),調(diào)用GetDlgItem函數(shù)獲得控件的對象的指針(指針類型是CWnd*)然后使用對象提供的函數(shù)進(jìn)行操作。
ID對于一個組件來說非常重要,通過向?qū)?,我們可以將一個變量和一個組件進(jìn)行關(guān)聯(lián)(映射)來實現(xiàn)數(shù)據(jù)交換,而這種綁定的關(guān)鍵就是將一個組件的ID與成員變量關(guān)聯(lián)。
(二)數(shù)據(jù)交換機(jī)制
UpdateData(BOOL b)函數(shù)可以進(jìn)行變量和組件內(nèi)容的交換,當(dāng)UpdateData函數(shù)的參數(shù)為TRUE時,數(shù)據(jù)從對話框控件傳遞給數(shù)據(jù)成員;參數(shù)為FALSE時,數(shù)據(jù)從數(shù)據(jù)成員傳遞至對話框成員。數(shù)據(jù)交換的實現(xiàn)是通過調(diào)用 CDialog::DoDataExchange函數(shù)。
當(dāng)我們想改變獲得到個別控件中的數(shù)據(jù)時,可以使用GetDlgItem函數(shù)得到對應(yīng)控件的指針,對指針進(jìn)行操作。
(三)特殊的Radio Button
Radio Button控件是分組的,同一組的Radio Button只能有一個被選中。這個機(jī)制的實現(xiàn)依賴于TAB順序,在資源視圖下按Ctrl-D鍵將顯示對話框的TAB焦點順序。舉一個例子來說明:
Radio1,Radio2,Radio3是三個不同的Radio
Button控件,其焦點順序為1,2,3。為了實現(xiàn)分組Radio1的Group屬性應(yīng)該為TRUE,其余兩個為FALSE。如果又有兩個
Radio4,Radio5焦點順序為6,7。則Radio4的Group屬性應(yīng)為TRUE,Radio4,Radio5被分為一組。
需要注意的是,Radio以Group屬性來分組,為了結(jié)束前一個組,你應(yīng)該將焦點順序為4,8的控件的Group屬性設(shè)為TRUE,否則編譯器會產(chǎn)生一個警告。
(四)一些技巧
通過向?qū)?,我們可以將一個類成員變量和控件關(guān)聯(lián)以進(jìn)行數(shù)據(jù)交換,例如將一個CString類型的變量和Edit控件關(guān)聯(lián)。將一個int變量和一組Radio Button關(guān)聯(lián)。但是,人總有犯錯的時候,當(dāng)我們修改或需要刪除這種關(guān)聯(lián)時,麻煩就來了。
在我的使用過程中沒有發(fā)現(xiàn)VS2005提供了刪除“已被關(guān)聯(lián)的控件成員變量”的向?qū)?,所以我使用的是比較麻煩的手動刪除。
1、 在對話框頭文件中刪除成員變量的定義
2、 在對話框cpp文件中刪除構(gòu)造函數(shù)初始化列表中的對應(yīng)變量的初始化
3、 在對話框cpp文件中刪除DoDataExchange函數(shù)中的對應(yīng)語句(根據(jù)變量名)
此時,在class view中的向?qū)е?,已?jīng)可以重新設(shè)定控件所關(guān)聯(lián)的成員變量了。
登錄框的制作:
在顯示主窗口之前顯示一個模式對話框來提示用戶登錄是一個常用的功能。只需要在PreCreateWindow函數(shù)中加入顯示對話框的代碼就可以完成這個功能。
有些時候,我們可能需要從一個控件對象來得到它的ID。比如,你的對話框中有好幾個滾動條,那么這些滾動條的事件都在OnHScroll ,OnVScroll中被響應(yīng)。如何區(qū)分是哪個滾動條就需要確定ID。
在這兩個函數(shù)的參數(shù)中有一個CScrollBar* pScrollBar指針,我們可以通過調(diào)用
pScrollBar->GetDlgCtrlID()來獲得ID,ID是一個整數(shù)。
在對話框編程中往往需要改變某個控件的文字,比如Edit控件和static text控件。此時使用SetDlgItemText(int nID, LPCTSTR lpzString)函數(shù)比較方便。
|
|
來自: ShangShujie > 《c》