1. 程式人生 > >MFC中給控件添加變量,DoDataExchange中

MFC中給控件添加變量,DoDataExchange中

codec logs -s .cn -c oid cati ++ 參數

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

你要在對話框的構造函數裏面初始化一個變量,再用DoDataExchange函數將它綁定到你的動態按扭中,比如:DDX_Check(pDX, IDC_CHECK1, m_Lesson1);這就是將m_Lesson1(這是一個外部變量,其定義在對話框的構造函數裏)綁定到IDC_CHECK1中。 看下DDX_Check函數原型:void AFXAPI DDX_Check(CDataExchange* pDX, int nIDC, int& value); 可以看到m_Lesson並不是真的添加到IDC_CHECK1控件裏了,註意這是int& value,只是一個值引用而已。 差不多的意思就是這個變量被框架傳遞給控件了。控件只負責使用此變量 ,而不負責改寫此變量。 值得註意的一點是:MSDN後面附加了一句 Never call this function directly. It is called by the UpdateData member function. Call UpdateData to initialize a dialog box’s controls or retrieve data from a dialog box.就是說此函數永遠不被直接調用,它只是呼叫UpdateData函數時才會被調用。 技術分享

UpdateData函數 內部調用了DoDataExchange。該函數只有一個布爾型參數,它決定了數據傳送的方向。 調用UpdateData(TRUE)將數據從對話框的控件中傳送到對應的數據成員中,調用UpdateData(FALSE)則將數據從數據成員中傳送給對應的控件。 UpdateData(false)是將變量的值傳到控件,表示對話框正在初始化. UpdateData(TRUE)是從控件中取值到關聯的變量, 表示數據正在獲取
CWnd::DoDataExchange https://msdn.microsoft.com/zh-cn/library/x4d0y489.aspx CWnd::DoDataExchange
時間: 2016年7月

調用由框架交換和驗證對話框數據。

語法
      virtual void DoDataExchange(
   CDataExchange* pDX 
);
參數
pDX

CDataExchange 對象的指針。

備註

不要直接調用此函數。 它由 UpdateData 成員函數調用。 調用 UpdateData 初始化對話框的控件或對話框中檢索數據。

當從 CDialog派生時應用程序特定的對話框選件類,則需要重寫該成員函數,如果您希望使用結構的自動數據交換和驗證。 添加變量向導將編寫該成員函數的重寫版本包含預期“數據映射”對話框的數據交換(ddx),並驗證(DDV)全局函數調用。

自動生成此成員函數的重寫版本,請對話框編輯器首先創建對話框資源,然後派生應用程序特定的對話框選件類。 然後使用添加變量向導關聯變量、數據和驗證大小與在新的對話框的各種控件。 向導然後將被重寫的 DoDataExchange,包含數據映射。 下面是示例DDX/DDV代碼塊生成由添加變量向導:

C++
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);//將變量的值傳給控件

MFC中給控件添加變量,DoDataExchange中