DoDataExchange函數其實是一項數據動態綁定技術。比如你在寫動態按鈕過程中須對按鈕添加變量時,怎么添加?控件類已經寫好了,其變量是已經固定的。你要添加新的變量就要用到DoDataExchange函數。

CWnd::DoDataExchange https://msdn.microsoft.com/zh-cn/library/x4d0y489.aspx
調用由框架交換和驗證對話框數據。
virtual void DoDataExchange( CDataExchange* pDX );
- pDX
-
為 CDataExchange 對象的指針。
不要直接調用此函數。 它由 UpdateData 成員函數調用。 調用 UpdateData 初始化對話框的控件或對話框中檢索數據。
當從 CDialog派生時應用程序特定的對話框選件類,則需要重寫該成員函數,如果您希望使用結構的自動數據交換和驗證。 添加變量向導將編寫該成員函數的重寫版本包含預期“數據映射”對話框的數據交換(ddx),並驗證(DDV)全局函數調用。
自動生成此成員函數的重寫版本,請對話框編輯器首先創建對話框資源,然后派生應用程序特定的對話框選件類。 然后使用添加變量向導關聯變量、數據和驗證大小與在新的對話框的各種控件。 向導然后將被重寫的 DoDataExchange,包含數據映射。 下面是示例DDX/DDV代碼塊生成由添加變量向導:
void CPenWidthsDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_THINPENWIDTH, m_nThinWidth); DDV_MinMaxInt(pDX, m_nThinWidth, 1, 20); DDX_Text(pDX, IDC_THICKPENWIDTH, m_nThickWidth); DDV_MinMaxInt(pDX, m_nThickWidth, 1, 20); }
DoDataExchange 重寫的成員函數必須在源文件中的宏語句。
有關數據交換的對話框和驗證的更多信息,請參見 顯示和操作數據窗體 和 數據交換的對話框和驗證。 有關添加變量向導生成的DDX_和DDV_宏的說明,請參見 技術說明26。
要求
頭文件位置: afxwin.h
VC中的DoDataExchange
怎么設置控件和變量關聯呢?
假如在對話框中加入一個picture控件的話
1.導入圖片
2.拉picture控件到對話框上,設置屬性,Type改為Bitmap,image選擇導入的圖片,ID一定要修改,不能為默認的IDC_Static,否則下面將做的Classwizard將不出現此控件ID。
3.ClassWizard中選擇member variable Category選擇 Control加入相應的CStatic變量 。
4.此時到DoDataExchange看,增加相應的數據交換語句,我的是DDX_Control(pDX, IDC_bt, m_bt);
void CUserDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_USER_EDIT, m_username);
DDV_MaxChars(pDX,m_username,10); //將用戶名的最大長度控件在10個字符
}
DDX:Dialog Data Exchange 表示對話框數據交換
DDV:Dialog Data Valid 表示對話框數據有效性
總之,這個函數對理解MFC框架是很有用的。對於寫控件也是很有用的。
UpdataData函數內部調用了DoDataExchange。該函數只有一個布爾型參數,它決定了數據傳送的方向。調用UpdateData(TRUE)將數據從對話框的控件中傳送到對應的數據成員中,調用UpdateData(FALSE)則將數據從數據成員中傳送給對應的控件。
UpdateData(FALSE)是將變量的值傳到控件.
UpdateData(TRUE)是從控件中取值到關聯的變量
DoDataExchange會被框架調用,用來改變和驗證對話框的數據。在這個函數中一般是將控件和某些變量關聯,當在其它地方改變量的值,通過UpdateData 進行雙向交換。如:
UpdateData();//將控件的值傳給變量
m_variable= "string";//分別為控件的變量賦值
UpdateData(FALSE);//將變量的值傳給控件