如果使用 DDX 机制,通常会在处理程序或对话构造函数中 OnInitDialog 设置对话框对象的成员变量的初始值。 在显示对话框之前,框架的 DDX 机制会将成员变量的值传输到对话框中的控件中,因此当对话框因DoModal或Create而出现时,这些值会显示出来。 默认实现OnInitDialog 在CDialog中调用类UpdateData的CWnd成员函数,以初始化对话框中的控件。
当用户单击“确定”按钮(或者每当使用参数 UpdateData 调用成员函数时),相同的机制会将值从控件传输到成员变量。 对话框数据验证机制验证指定了验证规则的任何数据项。
下图说明了对话数据交换。
对话框数据交换
UpdateData 可以在两个方向进行,具体由传递给它的 BOOL 参数指定。 若要执行交换,UpdateData 将设置 CDataExchange 对象并调用对话框类的 CDialog 的 DoDataExchange 成员函数的重写。 DoDataExchange 接受CDataExchange类型的参数。 CDataExchange传递给UpdateData表示交换上下文的对象,定义交换方向等信息。
当你(或代码向导)重写 DoDataExchange 时,可以指定对每个数据成员(控件)调用一个 DDX 函数。 每个 DDX 函数都了解如何基于由 CDataExchange 传递给 DoDataExchange 的 UpdateData 自变量提供的上下文双向交换数据。
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。 在这种情况下,对话框和对话框对象之间不会交换任何数据。