对话框数据交换

如果使用 DDX 机制,通常会在处理程序或对话构造函数中 OnInitDialog 设置对话框对象的成员变量的初始值。 在显示对话框之前,框架的 DDX 机制会将成员变量的值传输到对话框中的控件中,因此当对话框因DoModalCreate而出现时,这些值会显示出来。 默认实现OnInitDialogCDialog中调用类UpdateDataCWnd成员函数,以初始化对话框中的控件。

当用户单击“确定”按钮(或者每当使用参数 UpdateData 调用成员函数时),相同的机制会将值从控件传输到成员变量。 对话框数据验证机制验证指定了验证规则的任何数据项。

下图说明了对话数据交换。

数据模型和屏幕对话框数据交换的关系图。
对话框数据交换

UpdateData 可以在两个方向进行,具体由传递给它的 BOOL 参数指定。 若要执行交换,UpdateData 将设置 CDataExchange 对象并调用对话框类的 CDialogDoDataExchange 成员函数的重写。 DoDataExchange 接受CDataExchange类型的参数。 CDataExchange传递给UpdateData表示交换上下文的对象,定义交换方向等信息。

当你(或代码向导)重写 DoDataExchange 时,可以指定对每个数据成员(控件)调用一个 DDX 函数。 每个 DDX 函数都了解如何基于由 CDataExchange 传递给 DoDataExchangeUpdateData 自变量提供的上下文双向交换数据。

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

另请参阅

对话数据交换和验证
在 MFC 中使用对话框
对话框数据验证