MFC提供兩種方法在對話框中進行數據交換和數據檢查(Dialog data exchange/Dialog data validation),數據交換和數據檢查的思想是將某一變量和對話框中的一個子窗口進行關聯,然後通過調用BOOL UpdateData( BOOL bSaveAndValidate = TRUE )來指示MFC將變量中數據放入子窗口還是將子窗口中數據取到變量中並進行合法性檢查。
在進行數據交換時一個子窗口可以和兩種類型的變量相關聯,一種是控件(Control)對象,比如說按鈕子窗口可以和一個CButton對象相關聯,這種情況下你可以通過該對象直接控制子窗口,而不需要象上節中講的一樣使用GetDlgItem(IDC_CONTROL_ID)來得到窗口指針;一種是內容對象,比如說輸入框可以和一個CString對象關聯,也可以和一個UINT類型變量關聯,這種情況下你可以直接設置/獲取窗口中的輸入內容。
而數據檢查是在一個子窗口和一個內容對象相關聯時在存取內容時對內容進行合法性檢查,比如說當一個輸入框和一個CString對象關聯時,你可以設置檢查CString的對象的最長/最小長度,當輸入框和一個UINT變量相關聯時你可以設置檢查UINT變量的最大/最小值。在BOOL UpdateData( BOOL bSaveAndValidate = TRUE )被調用後,合法性檢查會自動進行,如果無法通過檢查MFC會彈出消息框進行提示,並返回FALSE。
設置DDX/DDV在VC中非常簡單,ClassWizard可以替你完成所有的工作,你只需要打開ClassWizard並選中Member Variables頁,如圖,
你可以看到所有可以進行關聯的子窗口ID列表,雙擊一個ID會彈出一個添加變量的對話框,如圖,
填寫相關的信息後按下確定按鈕就可以了。然後選中你剛才添加的變量在底部的輸入框中輸入檢查條件,如圖。
下面我們看一個例子,對話框上的子窗口如圖設置,各子窗口的ID和關聯的變量如下表:
ID
關聯的變量
作用
IDC_CHECK_TEST
BOOL m_fCheck
檢查框是否被選中
IDC_RADOI_TEST_1
int m_iSel
當前選擇的圓形按鈕的索引
IDC_COMBO_TEST
CString m_szCombo
組合框中選中的文本或是輸入的文本
IDC_EDIT_TEST
CString m_szEdit