DoDataExchange(CDataExchange *pDX) 收藏
在对话框中有这么一个函数
其作用是与对应的变量交换对话框数据
MSDN 解释为:
Called by the framework to exchange and validate dialog data.
virtual void DoDataExchange(
CDataExchange* pDX
);
pDX
A pointer to a CDataExchange object.
对话框的数据交换是指如下两种操作:
一是将内存数据写入对应的控制窗口
一是从控制窗口中读取相应的数据并存储于内存变量中
MFC为简化这些操作,以CDataExchange类和一些数据函数为基础,提供了一套数据交换和校验机制。
数据交换的方法:
首先,定义保存数据的内存变量----即给对话框添加成员变量,每个控制窗口可以对应一个成员变量。
比如,对于对话框的一个编辑控制窗口,可以定义一个CEdit类型的成员变量,或一个CString 类型的成员变量
第二, 重载对话框虚拟函数DoDataExchange,实现数据交换和验证
在VC6.0中可以使用ClassWizard协助自动的添加成员变量,修改DoDataExchange。
例如,一个对话框有两个窗口,一个是编辑框表示姓名,一个是编辑框表示年龄
使用ClassWizard添加成员变量,一个定义为CEdit,另一个定义为int 这些定义被//{ {AFX_DATA 和 //}}AFX_DATA引用 ,表示是ClassWizard添加的,程序员不必修改它们
相应的DoDataExchange实现如下:
void CExDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{
{AFX_DATA_MAP(CFtpDialog)
DDX_Control(pDX, IDC_NAME, m_name);
DDX_Text(pDX, IDC_AGE, m_nAge);
DDV_MinMaxInt(pDX, m_nAge, 1, 100);
//}}AFX_DATA_MAP
}
以上函数,DDX的含义:
DDX_Control 表示将 IDC_NAME 子窗口的内容传输到m_name,或者是将m_name的值传输到IDC_NAME子窗口
DDX_Text 表示把 IDC_AGE 子窗口的内容按整数类型保存到 m_nAge,或者将m_nAge的值传输到IDC_AGE窗口更新显示
DDV_MinMaxInt 表示m_nAge应该在1和100之间取值
上面提到的DDX_XXX数据交换函数是可以进行双向的数据交换,那么它们如何知道数据的传输方向的呢?
这通过DDX_XXXX函数的第一个参数pDX(也就是DoDataExchange的参数pDX)所指的CDataExChange对象决定,
CDataExchange定义如下:
class CDataExchange
{
// Attributes
public:
BOOL m_bSaveAndValidate; // TRUE 则 保存和验证数据
CWnd* m_pDlgWnd; // 指向一个对话框
// Operations (for implementors of DDX and DDV procs)
HWND PrepareCtrl(int nIDC); //返回指定