对话框数据交换
如果使用 DDX 机制,则可设置对话框对象的成员变量的初始值(通常在 OnInitDialog
处理程序或对话框构造函数中)。 就在显示对话框之前,框架的 DDX 机制会将成员变量的值传输到对话框中的控件,当对话框本身为响应 DoModal
或 Create
而出现时,这些控件将会显示在对话框中。 OnInitDialog
中的 CDialog
的默认实现调用 UpdateData
类的 CWnd
成员函数以在对话框中初始化控件。
当用户单击“确定”按钮时(或在你每次使用 TRUE 自变量调用 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 值。 在这种情况下,对话框和对话框对象之间不交换数据。