MFC 对话框编程要点
(一)对话框基本要点和生命周期
MFC对话框支持WYSIWYG编程模式,即What you see is what you get.。其类型分为模式对话框和非模式对话框
对话框由一个rc资源文件描述外观;与一个cpp类相连接(通过ID);对话框内的控件使用基于ID的变量映射来通讯。
模式对话框对象被定义后,通过调用DoModal()函数来显示对话框并进行相关操作,此函数当对话框被关闭时返回。其返回值标明了对话框是点击
OK退出(1),还是被Cancel(2)。
非模式对话框需要与某个
View相关联,以便对话框退出时发送消息给对应的View进行必要的处理。
在对话框显示前,系统会调用
OnInitDialog()函数,在这个函数中你可以设置一些控件属性,进行一些初始化工作。比如,设置滚动条的最大最小值,设置List列表的初始值等。其方法是将控件ID作为参数,调用GetDlgItem函数获得控件的对象的指针(指针类型是
CWnd*)然后使用对象提供的函数进行操作。
ID对于一个组件来说非常重要,通过向导,我们可以将一个变量和一个组件进行关联(映射)来实现数据交换,而这种绑定的关键就是将一个组件的ID与成员变量关联。
(二)数据交换机制
UpdateData(BOOL b)函数可以进行变量和组件内容的交换,当UpdateData函数的参数为TRUE时,数据从对话框控件传递给数据成员;参数为FALSE时,数据从数据成员传递至对话框成员。数据交换的实现是通过调用 CDialog::DoDataExchange函数。
当我们想改变获得到个别控件中的数据时,可以使用GetDlgItem函数得到对应控件的指针,对指针进行操作。
(三)特殊的Radio Button
Radio Button控件是分组的,同一组的Radio Button只能有一个被选中。这个机制的实现依赖于TAB顺序,在资源视图下按Ctrl-D键将显示对话框的TAB焦点顺序。举一个例子来说明:
Radio1,Radio2,Radio3是三个不同的Radio Button控件,其焦点顺序为1,2,3。为了实现分组Radio1的Group属性应该为TRUE,其余两个为FALSE。如果又有两个Radio4,Radio5焦点顺序为6,7。则Radio4的Group属性应为TRUE,Radio4,Radio5被分为一组。
需要注意的是,Radio以Group属性来分组,为了结束前一个组,你应该将焦点顺序为4,8的控件的Group属性设为TRUE,否则编译器会产生一个警告。
(四)一些技巧
通过向导,我们可以将一个类成员变量和控件关联以进行数据交换,例如将一个CString类型的变量和Edit控件关联。将一个int变量和一组Radio Button关联。但是,人总有犯错的时候,当我们修改或需要删除这种关联时,麻烦就来了。
在我的使用过程中没有发现VS2005提供了删除“已被关联的控件成员变量”的向导,所以我使用的是比较麻烦的手动删除。
1、 在对话框头文件中删除成员变量的定义
2、 在对话框cpp文件中删除构造函数初始化列表中的对应变量的初始化
3、 在对话框cpp文件中删除DoDataExchange函数中的对应语句(根据变量名)
此时,在class view中的向导中,已经可以重新设定控件所关联的成员变量了。
登录框的制作:
在显示主窗口之前显示一个模式对话框来提示用户登录是一个常用的功能。只需要在PreCreateWindow函数中加入显示对话框的代码就可以完成这个功能。
有些时候,我们可能需要从一个控件对象来得到它的ID。比如,你的对话框中有好几个滚动条,那么这些滚动条的事件都在OnHScroll ,OnVScroll中被响应。如何区分是哪个滚动条就需要确定
ID。
在这两个函数的参数中有一个
CScrollBar* pScrollBar指针,我们可以通过调用
pScrollBar->GetDlgCtrlID()来获得
ID,ID是一个整数。
在对话框编程中往往需要改变某个控件的文字,比如
Edit控件和static text控件。此时使用SetDlgItemText(int nID, LPCTSTR lpzString)函数比较方便。