MFC 的對話方塊資料交換 (DDX) 與資料驗證 (DDV) 機制,實現控制項與成員變數的雙向自動同步,是 MFC 核心生產力特性之一。
OnInitDialog → UpdateData(FALSE) → 成員變數 → 控制項OnOK → UpdateData(TRUE) → 控制項 → 成員變數 → DoModal 回傳 IDOKOnCancel → DoModal 回傳 IDCANCEL,不執行資料交換void CMyDialog::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); // 必須呼叫基類
// DDX 函數:雙向交換
DDX_Check(pDX, IDC_MY_CHECKBOX, m_bVar); // CheckBox ↔ bool
DDX_Text(pDX, IDC_MY_TEXTBOX, m_strName); // Edit ↔ CString
DDX_Radio(pDX, IDC_RADIO1, m_nOption); // Radio Group ↔ int
DDX_CBIndex(pDX, IDC_COMBO1, m_nSelIndex); // ComboBox 索引 ↔ int
DDX_CBString(pDX, IDC_COMBO1, m_strSelText); // ComboBox 文字 ↔ CString
DDX_LBIndex(pDX, IDC_LISTBOX, m_nSelIndex); // ListBox 索引 ↔ int
DDX_LBString(pDX, IDC_LISTBOX, m_strSelText); // ListBox 文字 ↔ CString
// DDV 函數:驗證 (僅在 UpdateData(TRUE) 時執行)
DDV_MaxChars(pDX, m_strName, 20); // 最大字元數
DDV_MinMaxInt(pDX, m_nAge, 1, 120); // 整數範圍
DDV_MinMaxDouble(pDX, m_dPrice, 0.0, 10000.0); // 浮點數範圍
}
m_bSaveAndValidate:TRUE = 控制項→變數 (驗證),FALSE = 變數→控制項m_hWndLastControl:失焦控制項 HWND,驗證失敗時設定焦點Fail() 中止交換並設定焦點| 控制項類型 | DDX 函數 | 變數類型 | 常用 DDV |
|---|---|---|---|
| Edit | DDX_Text | CString, int, double, etc. | DDV_MaxChars, DDV_MinMax* |
| CheckBox | DDX_Check | BOOL/bool | - |
| Radio Group | DDX_Radio | int (0-based index) | - |
| ComboBox | DDX_CBIndex / DDX_CBString | int / CString | - |
| ListBox | DDX_LBIndex / DDX_LBString | int / CString | - |
| Slider | DDX_Slider | int | DDV_MinMaxInt |
| Progress | DDX_Progress | int | - |
| DateTimePicker | DDX_DateTimeCtrl | COleDateTime / CTime | - |
| IP Address | DDX_IPAddress | DWORD | - |
void AFXAPI DDX_Custom(CDataExchange*, int, MyType&)DDX_Control(pDX, IDC_X, m_wndCtrl) 取得控制項包裝物件,不交換資料DDV 失敗拋出 CUserException,UpdateData 捕獲並回傳 FALSE,焦點自動導向錯誤控制項UpdateData(TRUE/FALSE) 強制同步 (如「套用」按鈕)DoDataExchange 遍歷所有映射,可考慮分組或延遲初始化Visual Studio 類別向導 (Ctrl+W) 可視化管理 DDX/DDV 映射:右鍵控制項 →「加入變數」→ 選擇類型/驗證規則 → 自動生成 DoDataExchange 程式碼與成員變數宣告。
DDX/DDV 將繁瑣的 GetDlgItemText/SetDlgItemInt 手工同步碼封裝為聲明式映射,關注點分離:資料邏輯與 UI 綁定解耦。善用類別向導、理解雙向流向、掌握驗證時機,是 MFC 高效開發關鍵。