創建好對話框資源后要做的就是生成對話框類了。生成對話框類主要包括新建對話框類、添加控件變量和控件的消息處理函數。
例程Addition是基於對話框的程序,所以程序自動創建了對話框模板IDD_ADDITION_DIALOG,並自動生成了對話框類CAdditionDlg,它是從CDialogEx
派生的。大家用過VC++6.0的可能記得,我們定義的對話框類是從CDialog類派生的,但在VS2010中,一般對話框類都是繼承自CDialogEx類。
一、創建對話框類
如果是自己新添加的對話框模板,怎樣為它創建對話框類呢?
1、在Resource View的“Dialog”節點上右鍵,然后在右鍵菜單中選擇“Insert Dialog”創建一個新的對話框模板,ID就使用默認的IDD_DIALOG1.
2、在中間區域會顯示新建的對話框模板,然后選中此對話框模板,點右鍵,在右鍵菜單中選擇Add Class。
3、選擇“Add Class”后會彈出一個對話框,在對話框中“Class name”下的編輯框中寫入自定義的類名就可以了,例如CMyDialog。
4、最后點擊“Finish”完成。
最終你就可以在Class View中看到新生成的對話框類CMyDialog了,並且Solution Explorer中有相應的MyDialog.h頭文件和MyDialog.cpp源文件生成。
CMyDialog類同樣派生於CDialogEx類。
注意,一般類名都以C打頭,又比如,CTestDlg。
二、為對話框中的控件添加變量
在上一講中為對話框添加了幾個控件,包括三個靜態文本框,三個編輯框,一個按鈕控件。程序自動生成的Cancel按鈕保留,作為退出按鈕,而OK按鈕
刪除掉了。
靜態文本框只是為了說明后面緊跟的編輯框中數據的意義,是被加數、加數還是和,這里也不為它們添加變量。編輯框中的數據可能京城變化,有必要
為它們每個控件關聯一個變量。
首先為被加數的編輯框IDC_SUMMAND_EDIT添加變量。
1、在編輯框上點擊右鍵,在右鍵菜單中選擇“Add Variable”。彈出添加成員變量的向導對話框。
2、我們想為其添加值變量而不是控件變量,所以對話框中“Category”下的組合框中選擇Value。
3、“Variable type”下的組合框此時默認選中的是“CString”,CString是字符串類,顯然不能進行加法運算。我們可以選擇double、float、int等。
這里我們選擇double,即編輯框相關聯一個double類型的變量。
4、在“Variable name”中寫入自定義的變量名。為其取名m_editSummand。
5、點擊“完成”。
注意,類的成員變量名一般以m_打頭,以標識它是一個成員變量。
參照此方法,在分別為加數的編輯框IDD_ADDEND_EDIT添加double型變量m_editAddend、和的編輯框IDD_SUM_EDIT添加double型變量m_editSum。
三、對話框類的數據交換和校驗
在程序運行界面中,用戶往往會改變控件的屬性,例如,在編輯框中輸入字符串,或者改變組合框的選中項,又或者改變復選框的選中狀態等。控件的屬性
改變后MFC會相應修改控件關聯變量的值。這種同步的改變是通過MFC為對話框類自動生成的成員函數DoDataExchange()來實現的,這也叫做對話框的數據交換和
檢驗機制。
我們為三個編輯框添加了變量后,在AdditionDlg.cpp中CAdditionDlg的DoDataExchange()函數體中多了三條DDX_Text調用語句。下面是函數體代碼:
如果我們在運行界面中輸入被加數,則通過CAddition的DoDataExchange()函數可以將輸入的值保存到m_summand變量中,反之如果程序運行中修改了變量
m_summand的值,則通過CAddition的DoDataExchange()函數也可以將新的變量值顯示到被加數的編輯框中。
但是這種數據交換機制中,DoDataExchange()並不是被自動調用的,而是需要我們在程序中調用CDialogEx::UpdateData()函數,由UpdateData()函數再去
自動調用DoDataExchange()的。
CDialogEx::UpdateData()函數的原型為:
BOOL UpdateData(BOOL bSaveAndValidate = TRUE);
參數:bSaveAndValidate用於指示數據傳輸的方向,TRUE表示從控件傳給變量,FALSE表示從變量傳給數據給控件。默認值是TRUE,即從控件傳給變量。
返回值:CDialogEx::UpdateData()函數的返回值表示是否成功,成功則返回TRUE,否則返回FALSE。