龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

Visual C++/MFC入门教程(五)(6)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
5.5 在对话框中进行数据交换和数据检查 MFC提供两种方法在对话框中进行数据交换和数据检查(Dialog data exchange/Dialog data validation),数据交换和数据检查的

5.5 在对话框中进行数据交换和数据检查

MFC提供两种方法在对话框中进行数据交换和数据检查(Dialog data exchange/Dialog data validation),数据交换和数据检查的思想是将某一变量和对话框中的一个子窗口进行关联,然后通过调用BOOL UpdateData( BOOL bSaveAndValidate = TRUE )来指示MFC将变量中数据放入子窗口还是将子窗口中数据取到变量中并进行合法性检查。

在进行数据交换时一个子窗口可以和两种类型的变量相关联,一种是控件(Control)对象,比如说按钮子窗口可以和一个CButton对象相关联,这种情况下你可以通过该对象直接控制子窗口,而不需要象上节中讲的一样使用GetDlgItem(IDC_CONTROL_ID)来得到窗口指针;一种是内容对象,比如说输入框可以和一个CString对象关联,也可以和一个UINT类型变量关联,这种情况下你可以直接设置/获取窗口中的输入内容。

而数据检查是在一个子窗口和一个内容对象相关联时在存取内容时对内容进行合法性检查,比如说当一个输入框和一个CString对象关联时,你可以设置检查CString的对象的最长/最小长度,当输入框和一个UINT变量相关联时你可以设置检查UINT变量的最大/最小值。在BOOL UpdateData( BOOL bSaveAndValidate = TRUE )被调用后,合法性检查会自动进行,如果无法通过检查MFC会弹出消息框进行提示,并返回FALSE。

设置DDX/DDV在VC中非常简单,ClassWizard可以替你完成所有的工作,你只需要打开ClassWizard并选中Member Variables页,如图,你可以看到所有可以进行关联的子窗口ID列表,双击一个ID会弹出一个添加变量的对话框,如图,填写相关的信息后按下确定按钮就可以了。然后选中你刚才添加的变量在底部的输入框中输入检查条件,如图。

下面我们看一个例子,对话框上的子窗口如图设置,各子窗口的ID和关联的变量如下表: ID 关联的变量 作用
IDC_CHECK_TEST BOOL m_fCheck 检查框是否被选中
IDC_RADOI_TEST_1 int m_iSel 当前选择的圆形按钮的索引
IDC_COMBO_TEST CString m_szCombo 组合框中选中的文本或是输入的文本
IDC_EDIT_TEST CString m_szEdit 输入框中输入的文本,最大长度为5
IDC_LIST_TEST CListBox m_lbTest 列表框对象
这时候ClassWizard会自动生成变量定义和相关代码,在对话框的构造函数中可以对变量的初始值进行设置,此外在BOOL CDialog::OnInitDialog()中会调用UpdateData(FALSE),即会将变量中的数据放入窗口中 。相关代码如下:

//头文件中的变量定义,ClassWizard自动产生
// Dialog Data
 //{{AFX_DATA(CMy55_s1Dlg)
 enum { IDD = IDD_MY55_S1_DIALOG };
 CListBox m_lbTest;
 int  m_iSel;
 CString m_szEdit;
 CString m_szCombo;
 BOOL m_fCheck;
 //}}AFX_DATA
//构造函数中赋初值
CMy55_s1Dlg::CMy55_s1Dlg(CWnd* pParent /*=NULL*/)
 : CDialog(CMy55_s1Dlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(CMy55_s1Dlg)
 m_iSel = -1;
 m_szEdit = _T("");
 m_szCombo = _T("");
 m_fCheck = FALSE;
 //}}AFX_DATA_INIT
.....
}
//ClassWizard产生的关联和检查代码
void CMy55_s1Dlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CMy55_s1Dlg)
 DDX_Control(pDX, IDC_LIST_TEST, m_lbTest);
 DDX_Radio(pDX, IDC_RADIO_TEST_1, m_iSel);
 DDX_Text(pDX, IDC_EDIT_TEST, m_szEdit);
 DDV_MaxChars(pDX, m_szEdit, 5);
 DDX_CBString(pDX, IDC_COMBO_TEST, m_szCombo);
 DDX_Check(pDX, IDC_CHECK_TEST, m_fCheck);
 //}}AFX_DATA_MAP
}

精彩图集

赞助商链接