在 MFC(Microsoft Foundation Classes)中,DoDataExchange 是一个用于**对话框数据交换(DDX)和数据验证(DDV)**的关键虚函数。它通常被重写在对话框类中(如继承自 CDialog 的类),负责在对话框的控件和对应的成员变量之间自动传输数据,并执行必要的数据有效性检查。
一、主要功能
-
数据交换
DoDataExchange内部通过调用 DDX 函数(如DDX_Text、DDX_Check等)将控件的内容与对话框类的成员变量进行双向同步。- 当调用
UpdateData(TRUE)时,数据从控件"收集"到变量。 - 当调用
UpdateData(FALSE)时,数据从变量"推送"到控件。
- 当调用
-
数据验证
在交换数据的同时,可以调用 DDV 函数(如
DDV_MinMaxInt)对输入的数据进行范围或格式检查,确保用户输入符合预期。 -
对话框初始化
在对话框创建时(通常在
OnInitDialog之后),MFC 会自动调用UpdateData(FALSE),从而将成员变量的初始值显示在控件上。
二、工作流程
DoDataExchange本身不会主动执行 ,而是通过CWnd::UpdateData成员函数来触发。- 当你在代码中调用
UpdateData(TRUE)或UpdateData(FALSE)时,UpdateData内部会调用DoDataExchange,并传递一个布尔参数(TRUE表示从控件到变量,FALSE表示从变量到控件)。
三、示例
假设有一个对话框包含一个编辑框(IDC_EDIT_NAME)和一个复选框(IDC_CHECK_READ),对应的成员变量为 m_strName(CString)和 m_bRead(BOOL),则 DoDataExchange 可能如下:
cpp
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
DDX_Check(pDX, IDC_CHECK_READ, m_bRead);
DDV_MaxChars(pDX, m_strName, 20); // 验证姓名不超过20个字符
}
- 当需要将控件内容读入变量时(如点击"确定"按钮后),调用
UpdateData(TRUE),数据从编辑框和复选框流入m_strName和m_bRead。 - 当需要显示初始值或更新界面时,调用
UpdateData(FALSE),变量的值会显示到对应控件上。
四、总结
DoDataExchange 是 MFC 对话框数据管理的核心,它封装了控件与变量之间的数据交换逻辑,简化了代码编写,并提供了自动的数据验证机制。理解它有助于更好地掌握 MFC 的对话框编程。