首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 對話方塊資料交換 (DDX/DDV) 機制深度解析

     編輯:關於VC++

MFC 的對話方塊資料交換 (DDX) 與資料驗證 (DDV) 機制,實現控制項與成員變數的雙向自動同步,是 MFC 核心生產力特性之一。

核心流程

  1. 初始化階段:OnInitDialog → UpdateData(FALSE) → 成員變數 → 控制項
  2. 使用者操作:修改控制項內容
  3. 確認關閉:按下「確定」 → OnOK → UpdateData(TRUE) → 控制項 → 成員變數 → DoModal 回傳 IDOK
  4. 取消關閉:按下「取消」/Esc → OnCancel → DoModal 回傳 IDCANCEL,不執行資料交換

UpdateData 雙向交換機制

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); // 浮點數範圍
}

CDataExchange 內容參數角色

  • m_bSaveAndValidate:TRUE = 控制項→變數 (驗證),FALSE = 變數→控制項
  • m_hWndLastControl:失焦控制項 HWND,驗證失敗時設定焦點
  • 提供 Fail() 中止交換並設定焦點

常用 DDX/DDV 函數速查

控制項類型DDX 函數變數類型常用 DDV
EditDDX_TextCString, int, double, etc.DDV_MaxChars, DDV_MinMax*
CheckBoxDDX_CheckBOOL/bool-
Radio GroupDDX_Radioint (0-based index)-
ComboBoxDDX_CBIndex / DDX_CBStringint / CString-
ListBoxDDX_LBIndex / DDX_LBStringint / CString-
SliderDDX_SliderintDDV_MinMaxInt
ProgressDDX_Progressint-
DateTimePickerDDX_DateTimeCtrlCOleDateTime / CTime-
IP AddressDDX_IPAddressDWORD-

進階技巧與注意事項

  1. 自訂 DDX:針對特殊控制項/資料類型,編寫 void AFXAPI DDX_Custom(CDataExchange*, int, MyType&)
  2. 動態控制項:DDX_Control(pDX, IDC_X, m_wndCtrl) 取得控制項包裝物件,不交換資料
  3. 驗證失敗處理:DDV 失敗拋出 CUserException,UpdateData 捕獲並回傳 FALSE,焦點自動導向錯誤控制項
  4. 手動觸發交換:隨時呼叫 UpdateData(TRUE/FALSE) 強制同步 (如「套用」按鈕)
  5. 效能考量:大量控制項時,DoDataExchange 遍歷所有映射,可考慮分組或延遲初始化

類別向導自動化

Visual Studio 類別向導 (Ctrl+W) 可視化管理 DDX/DDV 映射:右鍵控制項 →「加入變數」→ 選擇類型/驗證規則 → 自動生成 DoDataExchange 程式碼與成員變數宣告。

總結

DDX/DDV 將繁瑣的 GetDlgItemText/SetDlgItemInt 手工同步碼封裝為聲明式映射,關注點分離:資料邏輯與 UI 綁定解耦。善用類別向導、理解雙向流向、掌握驗證時機,是 MFC 高效開發關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved