如果使用 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。 在这种情况下,对话框和对话框对象之间不会交换任何数据。