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和关联的变量如下表: 在上面的例子中我们看到利用DDX/DDV和UpdateData(BOOL)调用我们可以很方便的存取数据,而且也可以同时进行合法性检查。下载例子代码 《Visual C++开发指南》 闻怡洋/文
这时候ClassWizard会自动生成变量定义和相关代码,在对话框的构造函数中可以对变量的初始值进行设置,此外在BOOL CDialog::OnInitDialog()中会调用UpdateData(FALSE),即会将变量中的数据放入窗口中 。相关代码如下:
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自动产生
// 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
}
//在OnInitDialog中利用已经关联过的变量m_lbTest
BOOL CMy55_s1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
…
// TODO: Add extra initialization here
//设置列表框中数据
m_lbTest.AddString(“String 1″);
m_lbTest.AddString(“String 2″);
m_lbTest.AddString(“String 3″);
m_lbTest.AddString(“String 4″);
return TRUE; // return TRUE unless you set the focus to a control
}
//对两个按钮消息处理
//通过UpdateData(TRUE)得到窗口中数据
void CMy55_s1Dlg::OnGet()
{
if(UpdateData(TRUE))
{
//数据合法性检查通过,可以使用变量中存放的数据
CString szOut;
szOut.Format(“radio =%d \ncheck is %d\nedit input is
%s\ncomboBox input is %s\n”,
m_iSel,m_fCheck,m_szEdit,m_szCombo);
AfxMessageBox(szOut);
}
//else 未通过检查
}
//通过UpdateData(FALSE)将数据放入窗口
void CMy55_s1Dlg::OnPut()
{
m_szEdit=”onPut test”;
m_szCombo=”onPut test”;
UpdateData(FALSE);
}
-
近期文章
近期评论
- coolker 发表在《打造最快的Hash表》
- struggle 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- zhanghaibo 发表在《提供C语言教学课件(适用于初学者)》
- diys 发表在《C语言编程宝典(王大刚) 1.1 C 语言的产生与发展》
文章归档
- 2022 年十月
- 2014 年一月
- 2013 年十二月
- 2012 年十一月
- 2012 年七月
- 2012 年六月
- 2012 年五月
- 2012 年四月
- 2012 年三月
- 2012 年二月
- 2011 年十二月
- 2011 年十月
- 2011 年九月
- 2011 年八月
- 2011 年七月
- 2011 年六月
- 2011 年五月
- 2011 年四月
- 2011 年三月
- 2011 年二月
- 2011 年一月
- 2010 年十二月
- 2010 年十一月
- 2010 年十月
- 2010 年九月
- 2010 年八月
- 2010 年七月
- 2010 年六月
- 2010 年五月
- 2010 年四月
- 2010 年三月
- 2010 年二月
- 2010 年一月
- 2009 年十二月
- 2009 年十一月
- 2009 年十月
- 2009 年九月
- 2009 年八月
- 2009 年七月
- 2009 年六月
- 2009 年五月
- 2009 年四月
- 2009 年三月
- 2009 年二月
- 2009 年一月
- 2008 年十二月
- 2008 年十一月
- 2008 年十月
- 2008 年九月
- 2008 年八月
- 2008 年七月
- 2008 年六月
- 2008 年五月
- 2008 年四月
- 2008 年三月
- 2008 年二月
- 2008 年一月
- 2007 年十二月
- 2007 年十一月
- 2007 年十月
- 2007 年九月
- 2007 年八月
- 2007 年七月
- 2007 年六月
- 2007 年三月
- 2007 年二月
- 2007 年一月
- 2006 年十二月
- 2006 年十一月
- 2006 年十月
- 2006 年九月
- 2006 年八月
- 2006 年七月
- 2006 年六月
- 2006 年五月
- 2006 年四月
- 2006 年三月
- 2006 年二月
- 2006 年一月
- 2005 年十二月
- 2005 年十一月
分类目录
功能