如果使用 DDX 机制,通常会在处理程序或对话构造函数中 OnInitDialog
设置对话框对象的成员变量的初始值。 在显示对话框之前,框架的 DDX 机制将成员变量的值传输到对话框中的控件,当对话框本身出现响应或Create
。DoModal
调用类的成员函数来初始化对话框中控件的默认实现OnInitDialog
UpdateData
CDialog
。CWnd
当用户单击“确定”按钮(或者每当使用参数 TRUE 调用UpdateData
成员函数时),相同的机制会将值从控件传输到成员变量。 对话框数据验证机制验证指定了验证规则的任何数据项。
下图说明了对话数据交换。
对话数据交换
UpdateData
按传递给它的 BOOL 参数指定的两个方向工作。 若要执行交换,UpdateData
请设置一个CDataExchange
对象并调用对话类的成员函数的CDialog
DoDataExchange
重写。
DoDataExchange
采用类型 CDataExchange
为 ..
CDataExchange
传递给UpdateData
表示交换上下文的对象,定义交换方向等信息。
当你(或代码向导)重写 DoDataExchange
时,可以为每个数据成员(控件)指定对一个 DDX 函数的调用。 每个 DDX 函数都知道如何根据传递给你的DoDataExchange
UpdateData
参数提供的CDataExchange
上下文在两个方向交换数据。
MFC 为不同类型的交换提供了许多 DDX 函数。 以下示例演示了一个重写,其中两个 DoDataExchange
DDX 函数和一个 DDV 函数被调用:
void CTestDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Check(pDX, IDC_MY_CHECKBOX, m_bVal);
DDX_Text(pDX, IDC_MY_TEXTBOX, m_strName);
DDV_MaxChars(pDX, m_strName, 20);
}
线DDX_
DDV_
是数据映射。 所示的示例 DDX 和 DDV 函数分别用于复选框控件和编辑框控件。
如果用户取消模式对话框,则 OnCancel
成员函数将终止对话框并 DoModal
返回值 IDCANCEL。 在这种情况下,对话框和对话框对象之间不会交换任何数据。