对话数据交换

如果使用 DDX 机制,通常会在处理程序或对话构造函数中 OnInitDialog 设置对话框对象的成员变量的初始值。 在显示对话框之前,框架的 DDX 机制将成员变量的值传输到对话框中的控件,当对话框本身出现响应或CreateDoModal 调用类的成员函数来初始化对话框中控件的默认实现OnInitDialogUpdateDataCDialogCWnd

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

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

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

UpdateData 按传递给它的 BOOL 参数指定的两个方向工作。 若要执行交换,UpdateData请设置一个CDataExchange对象并调用对话类的成员函数的CDialogDoDataExchange重写。 DoDataExchange 采用类型 CDataExchange为 .. CDataExchange传递给UpdateData表示交换上下文的对象,定义交换方向等信息。

当你(或代码向导)重写 DoDataExchange时,可以为每个数据成员(控件)指定对一个 DDX 函数的调用。 每个 DDX 函数都知道如何根据传递给你的DoDataExchangeUpdateData参数提供的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。 在这种情况下,对话框和对话框对象之间不会交换任何数据。

另请参阅

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