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

MFC 對話框數據交換與驗證(DDX/DDV)完整指南

     編輯:關於C語言

核心概念:變量與控件的雙向綁定

在 MFC 開發中,對話框的數據交換與驗證(Dialog Data Exchange/Validation,簡稱 DDX/DDV)是連接界面控件與成員變量的核心機制。其核心思想在於建立「變量 ↔ 子窗口」的關聯,再透過 BOOL UpdateData(BOOL bSaveAndValidate = TRUE) 統一協調數據流向:

  • bSaveAndValidate = TRUE:將控件內容取回變量,並執行合法性檢查(DDV)。
  • bSaveAndValidate = FALSE:將變量數據推送至控件顯示。

兩類關聯模式

1. 控件型變量(Control Variable)

直接綁定控件對象(如 CButton、CEdit、CComboBox),可直接操作控件行為(啟用/禁用、設定字型、取得游標位置等),無需呼叫 GetDlgItem() 取得指標。

2. 數值型變量(Value Variable)

綁定資料型別(CString、int、UINT、float 等),自動完成「控件文字 ↔ 變量數值」的轉換,適合單純的資料存取。

數據驗證(DDV)機制

僅在「數值型變量」綁定時生效。常見驗證宏:

變量型別驗證宏說明
CStringDDV_MaxChars / DDV_MinChars限制字串長度
UINT/intDDV_MinMaxUInt / DDV_MinMaxInt限制數值範圍
float/doubleDDV_MinMaxFloat / DDV_MinMaxDouble限制浮點數範圍

若驗證失敗,MFC 自動彈出訊息框並讓 UpdateData() 回傳 FALSE,焦點自動導向違規控件。

ClassWizard 視覺化配置步驟

  1. 開啟 ClassWizard → Member Variables 頁籤。
  2. 雙擊控件 ID,於 Add Member Variable 對話框填入:
    變量名稱、類別(Control/Value)、型別。
  3. 確定後,於底部 Validation 區輸入驗證條件(如 Max/Min 值)。

實戰範例:綁定表與代碼骨架

對話框佈局範例

控件 ID綁定變量型別/類別用途
IDC_CHECK_TESTm_fCheckBOOL (Value)記錄核取方塊勾選狀態
IDC_RADIO_TEST_1m_iSelint (Value)單選群組目前索引(0-based)
IDC_COMBO_TESTm_szComboCString (Value)取得編輯區文字或選中項目
IDC_EDIT_TESTm_szEditCString (Value)一般文字輸入
// 對話框類頭文件片段
class CMyDlg : public CDialog
{
    //{{AFX_DATA(CMyDlg)
    BOOL  m_fCheck;
    int   m_iSel;
    CString m_szCombo;
    CString m_szEdit;
    //}}AFX_DATA

protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支援
};

// 對話框類實作片段
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CMyDlg)
    DDX_Check(pDX, IDC_CHECK_TEST, m_fCheck);
    DDX_Radio(pDX, IDC_RADIO_TEST_1, m_iSel);
    DDX_CBString(pDX, IDC_COMBO_TEST, m_szCombo);
    DDX_Text(pDX, IDC_EDIT_TEST, m_szEdit);
    //}}AFX_DATA_MAP

    // DDV 驗證範例
    DDV_MaxChars(pDX, m_szEdit, 50);        // 最多 50 字
    DDV_MinMaxInt(pDX, m_iSel, 0, 2);       // 單選索引 0~2
}

常見陷阱與最佳實務

  • 忘記呼叫 UpdateData(FALSE):初始化變量後必須呼叫,否則控件顯示舊值。
  • DDV 順序敏感:驗證宏必須緊跟對應的 DDX 宏之後。
  • 動態建立的控件:需手動在 DoDataExchange 加入 DDX_* 宏,ClassWizard 不會自動維護。
  • 自訂驗證:可重寫 OnOK(),先呼叫 UpdateData(),失敗則 return;成功再呼叫 CDialog::OnOK()。

進階技巧:DDX_Control 取得控件指標

若需同時享有「數值自動轉換」與「控件精細操作」,可對同一控件建立兩個變量:

// 頭文件
CEdit   m_ctlEdit;   // Control 型別
CString m_strEdit;   // Value 型別

// DoDataExchange
DDX_Control(pDX, IDC_EDIT_TEST, m_ctlEdit);
DDX_Text(pDX, IDC_EDIT_TEST, m_strEdit);

此時 m_ctlEdit.SetLimitText(20) 限制輸入長度,m_strEdit 自動同步內容。

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