对话框数据交换

如果使用 DDX 机制,则可设置对话框对象的成员变量的初始值(通常在 OnInitDialog 处理程序或对话框构造函数中)。 就在显示对话框之前,框架的 DDX 机制会将成员变量的值传输到对话框中的控件,当对话框本身为响应 DoModalCreate 而出现时,这些控件将会显示在对话框中。 OnInitDialog 中的 CDialog 的默认实现调用 UpdateData 类的 CWnd 成员函数以在对话框中初始化控件。

当用户单击“确定”按钮时(或在你每次使用 TRUE 自变量调用 UpdateData 成员函数时),同一个机制都会将值从控件传输到成员变量。 对话框数据验证机制将验证为其指定了验证规则的所有数据项。

下图演示了对话框数据交换。

Diagram of data model and on screen dialog box data exchange.
对话框数据交换

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

当你(或代码向导)重写 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 中使用对话框
对话框数据验证