10.2.3 对话框数据交换与验证
虽然调用CWnd类的SetDlgItemText()和GetDlgItemText()成员函数或调用控件对象的SetWindowText()成员函数和GetWindowText()成员函数,可以设置对话框中的控件的值和获取取值,但是此方法需要手动添加,比较麻烦。因此,MFC提供了一种简单的方法完成这两种工作,即对话框数据交换机制。
对话框数据交换(DDX)是一种初始化对话框控件中的控件和从用户处收集数据输入的简单方法,使得用户在对话框的控件与对话框对象的成员变量中交换数据更容易。要初始化对话框中的控件,用户可以设置对话框对象中的数据成员的值,框架会在对话框显示之前将值传给控件,同样可以在任何时间使用用户输入的数据更新对话框数据成员。同时,也可以通过指向数据成员的变量使用数据。与此同时,对话框数据验证机制自动验证对话框控件的值的分配。
使用DDX机制,用户通常在OnInitDialog()处理函数或对话框构造函数中设置对话框对象的成员变量的初始值,对话框显示之前,框架的DDX机制将成员变量的值传输给对话框中的控件。对于模式对话框,如果DoModal()函数返回IDOK,则在对话框对象被销毁之前用户可以获取用户输入的任何数据,如果DoModal()函数返回IDCANCEL,则对话框控件和数据变量中并没有进行数据交换,此时获取控件取值会产生逻辑错误。对于非模式对话框,用户可以在任何时间通过调用带有TRUE参数的UpdateData()函数从对话框对象中获取数据。
对话框验证(DDV)机制是验证对话框中数据输入的有效性的简单方法。在对话框中可以使用类向导创建数据成员和它们的数据类型和指定验证规则。
MFC为各种不同的数据类型都提供了DDX函数。通常情况下,在对话框类的DoDataExchange()函数中重写DDX处理和DDV处理,代码如下:
- void CDialogExampleDlg::DoDataExchange
(CDataExchange* pDX)// 数据交换函数 - {
- CDialog::DoDataExchange(pDX);
// 调用基类的数据交换函数 - //{{AFX_DATA_MAP(CDialogExampleDlg)
// 数据映射开始 - DDX_Check(pDX, IDC_CHECK_PASS, m_bPass);
// 定义是否使用密码选择框变量 - DDX_CBString(pDX, IDC_COMBO_SEX, m_strSex);
// 性别组合框变量 - DDV_MaxChars(pDX, m_strSex, 20);
// 性别文本框中最大字符数为20 - DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
// 名称编辑框变量 - DDV_MaxChars(pDX, m_strName, 50);
// 名称编辑框字符最大数为50 - //}}AFX_DATA_MAP
// 数据映射结束 - }
上面的例子在数据映射的//{{AFX_DATA_MAP和//}}AFX_DATA_MAP限定符中间定义了DDX和DDV语句。其中,第一句DDX表示m_bPass变量与ID为IDC_CHECK_PASS的复选框相关联,第二句DDX表示m_strSex变量与ID为IDC_COMBO_SEX的组合框相关联,第三句DDX表示m_strName变量与ID为IDC_EDIT_NAME的文本框相关联。第一句DDV表示m_strSex变量的最大字符数不能超过20个,第二句DDV表示m_strName变量的最大字符数不能超过50个。这些DDV函数就是进行数据验证的函数,如果数据验证失败,则DDV函数会使用消息对话框提示用户,并将焦点定位到发生错误的控件中,使得用户重新输入数据。通常控件的DDV函数会在DDX函数发生后被调用。
除了使用标准的DDX函数和DDV函数,用户还可以自定义DDX和DDV函数。要注意的是,类向导会在用户的数据映射中编写所有的DDX和DDV调用。不要手动在限定注释间编辑数据映射行,以免发生错误,最好使用VC 6.0提供的向导,具体步骤如下:
(1)按下Ctrl+W组合键,打开MFC ClassWizard对话框,选择Member Variables选项卡,如图10-9所示。
(2)在Control IDs列表框中选择要添加的成员变量的控件,单击Add Variable按钮,打开Add Member Variable对话框,如图10-10所示。
|
| (点击查看大图)图10-9 MFC ClassWizard对话框 |
|
| 图10-10 Add Member Variable对话框 |
(3)在上面的对话框中的Member variable name文本中输入成员变量的名称,在Category下拉列表框中选择Value或Control选项,分别代表创建的成员变量是数据值还是控件值,在Variable type下拉列表框中选择创建的成员变量的类型,单击OK命令,完成数据成员的DDX的添加。
(4)添加完成后,返回MFC ClassWizard对话框,此时,再次选中对应的控件时,会在对话框底部出现对应的DDV设置。本例因为创建的是CString类型的数据成员,因此会出现Maximum Characters文本框,其中用于设置添加的字符串变量的最大长度,如图10-11所示。
|
| (点击查看大图)图10-11 DDV设置 |
(5)按照上面(2)到(4)步骤依次添加需要的数据成员变量,单击OK按钮,完成数据数据交换和验证的添加。
注意:对于一个给定的控件,可以同时定义值属性成员变量和控件属性成员变量。但是只能有一个控件成员变量,因为多个对象附加到一个控件中,会导致在消息映射中模糊不清,无法定位。