第2章 Windows通用控件和对话框编程
2.1 控件概述
控件是放在对话框上的元素,如文本框、标记框、列表框、按钮、进度指示器和滑块等。控件的引入使Windows编程相对DOS编程大大简化,极大地减轻了编程人员的负担。
2.1.1 控件的添加和移除
在编辑窗口的旁边有一个控制面板,如图2.1所示,这个控制面板提供了Window常用的通用控件。
图2.1 控件面板
若用户看不到控制面板,请在集成开发环境中工具栏区域的空白处单击鼠标右键,并在随之弹出的菜单中选中Controls项。
在控制面板上用鼠标选择一个控件,然后在对话框中单击鼠标左键,则相应的控件就被放到了对话框模板中。当用鼠标选择控件时,会出现一个围绕它的虚框,拖动虚框的边界可以改变控件的大小。控件可以被拖动,在拖动过程中,若按住Ctrl键,则控件会被复制。
用户一次选择多个控件的方法有两种:
● 在对话框的空白处拖动鼠标,则拖出来的虚线框内的控件将被选中。
● 在选择控件时按住Ctrl键,则可以多重选择。
移除控件的方法是先选中再按Delete键。
2.1.2 控件的属性
选中某个控件后按回车键,都会弹出一个属性对话框,属性对话框用来设置控件的各种属性。属性对话框是标签式对话框,不论哪种控件,其第一页都是常规属性(Gerneral)。一个典型的控件属性对话框如图2.2所示。
图2.2 控件属性对话框
在控件属性对话框的常规属性中,有一些控件共有的属性:
● ID属性:用于指定控件的标志符(类似菜单ID), Windows系统和应用程序依靠ID来区分不同的控件。
● Caption属性:静态文本、分组框、按钮、检查框、单选按钮等控件可以显示标题,用来对控件进行文字说明。控件标题中的字符&使紧跟其后的字符增加下画线,按Alt+下画线字母将启动该控件。
● Visible属性:用来指定控件是否可见,默认情况下此复选框被选中。
● Disable属性:使控件允许或禁止,禁止的控件呈灰色显示,不能接收任何输入。
● Group属性:用来指定一组控件,用户可以用箭头键在该组控件内移动。在同一组内的单选按钮具有互斥的特性。如果一个控件具有Group属性,则这个控件以及按Tab顺序紧随其后的所有控件都属于一个组的,直到遇到另一个有Group属性的控件为止。
● Tab Stop属性:用户可以按Tab键移动到具有Tab Stop属性的控件上。Tab移动的顺序可以由用户指定。按Ctrl+D组合键可以显示对话框中所有控件的Tab顺序。默认的Tab顺序是控件的创建次序。
2.2 常用控件
2.2.1 静态文本框
静态文本框是一种静态控件。静态控件上面可以显示字符串、矩形、图标、光标、位图以及元文件等,常用来作为其他控件的标签,也可以作为容器容纳其他控件。静态文本框使用户无须编写代码就可以方便地在静态控件上显示字符串。静态文本框的属性主要包括:
● Caption:静态文本框上所显示的字符串。
● Align text:文本框上字符串的对齐方式。
● Center vertically:竖直方向的居中对齐。
● No Wrap:显示文本到达控件边界时是否换行。
● Sunken:文本框凹陷显示。
● Border:给文本框加一个黑边框作为边界。
静态控件由MFC类库中的Cstatic类来管理,它是窗口类CWnd的子类。
Cstatic的主要成员函数如下:
● SetBitMap:设置要在静态控件上显示的位图,参数是位图句柄,返回以前与控件相联系的位图句柄。
● GetBitMap:得到通过函数SetBitMap设置的与控件相关联的位图句柄。
● SetIcon:设置要在静态控件上显示的图标,参数是图标句柄,返回以前与控件相联系的图标句柄。
GetIcon:得到通过函数SetIcon设置的与控件相关联的图标句柄。
SetCursor:设置要在静态控件上显示的光标,参数是光标句柄,返回以前与控件相联系的光标句柄。
使用上述函数要注意,要想让静态文本框显示某种类型的对象,必须设置静态文本框本身的相应属性,比如调用SetBitMap显示位图时要设置CStatic的SS_BITMAP属性。一个静态文本框通常不会接受鼠标和键盘输入,但是如果在属性对话框中设置了其Notify属性,当鼠标单击时,它会给父窗口一个BN_CLICKED事件通知。
2.2.2 编辑文本框
编辑框主要用于在程序中输入文本,它的功能由CEdit类来实现。编辑框的主要功能和属性如下:
● Multi_line:多行编辑框。
● AutoHScroll:如果设此属性,当用户输入的文本框到达控件边界时,控件自动水平滚动,允许用户输入更多内容。
● Number:只允许输入数字。
● Password:输入的任何字符都显示成“*”号。
● Uppercase/Lowercase:所有的输入字符都显示成大写/小写。
CEdit类的常用成员函数如下:
● GetSel:获得文本框控件中当前选择的起始字符和终止字符位置。
● SetSel:选择文本框控件中的一个字符范围。
● Undo/Clear/Copy/Cut/Paste:剪贴板操作。
当用户对编辑框进行操作时,编辑框会发送相应得控件通知消息给父窗口,这些编辑框控件通知消息主要有
● EN_UPDATE:控件即将改变之后的文本内容。
● EN_CHANGE:控件文本内容改变了。
● EN_SETFOCUS:控件即将获得输入焦点。
● EN_KILLFOCUS:控件即将失去输入焦点。
● EN_MAXTEXT:控件已经不能再接受输入焦点,新的输入被删除。
2.2.3 按钮
在Windows系统中,按钮、复选框、单选框、分组框这4个控件都是由MFC类CButton来管理的,可统称为按钮控件。如何在一个CButton中区分这些不同形态呢?这就要通过按钮风格来区分。CButton类对象中BS_CHECKBOX、BS_GROUPBOX、BS_PUSHBUTTON和BS_RADIOBUTTON分别表示复选框、分组框、普通按钮和单选框。CButton的成员函数SetButtonStyle、GetButtonStyle分别用来在程序中设置和得到按钮的风格。
按钮控件的重要属性有
● Caption:按钮上所有显示的文本。
● Multiline:如果按钮上要显示的文本长度超过了控件本身的长度,则文本分成多行显示。
● Icon:按钮上显示一个图标。
● Bitmap:按钮上显示一个位图。
● Horizontal/Vertical alignment:标题文本的水平/竖直对齐方式。
CButton类的常用成员函数如下:
● GetState:获得按钮的状态。
● SetState:设置按钮的状态。
● SetCheck/GetCheck:设置/获得按钮的选择状态。
● SetButtonStyle/GetButtonStyle:设置/获得按钮的风格。如把一个普通按钮变成复选框可以这样:SetButtonStyle(BS_CHECKBOX)。
按钮控件只有两个通知消息:BN_CLICKED和BN_DOUBLECLICKED,分别表示按钮被单击和双击。
2.2.4 列表框
列表框是一个项目列表,供用户选择和浏览。它分为单选列表框和多选列表框。对于前者,用户只能选择其中的一个项目;而对于后者,用户可以通过Ctrl和Shift键选择多个。
列表框由MFC类CListBox来管理,它的主要成员函数如下:
● GetCount:获得列表框中项目的个数。
● SetItemData/GetItemData:设置/获得与一个项目相联系的32位整数值。
● GetSel:判断一个项目是否被选中。
● SetSel:在一个多选列表框中选择一个项目或把一个项目取消选择。
● SetCurSel/GetCurSel:在单选列表框中选中一个项目/获得一个被选中项目的项目索引。
● GetSelCount:在一个多选列表框中得到当前被选中的项目数。
● GetSelItems:获得多选列表框中所有被选中的项目索引,存放在一个整数缓冲区中。
● GetText:根据项目索引,得到相应得项目字符串。
● AddString:向列表框增加一个字符串项目,增加的位置是在最后。
● InsertString:根据参数,在列表框某项目的后面插入一个字符串项目。
● ResetString:删除列表框所有项目。
● DeleteString:从列表框删除一个字符串项目。
● Dir:把当前目录下所有文件加入列表框显示。
给列表框增加项目通常在对话框的OnInitDialog函数中对列表框的项目进行初始化。
2.2.5 组合框
组合框是列表框与静态框或列表框与编辑框的结合。组合框共有三种风格:
● Simple:列表框与编辑框的结合,并且列表框始终显示在下面。
● Dropdown:也是列表框与编辑框的结合,但列表框平时不显示出来,需单击下拉按钮方可显示。
● DropList:列表框与静态控件的组合,列表框平时不显示出来。
组合框的功能由MFC类CComboBox来实现,它的主要成员函数如下:
● GetCount:获得组合框的列表框中项目的数目。
● SetCurSel/GetCurSel:在组合框列表框中选中一个项目/获得被选中的项目索引。
● SetEditSel:设置组合框编辑控件中的字符。
● GetEditSel:获得组合框的编辑控件中当前选择的首尾字符位置。
● GetLBText:根据项目索引,得到列表框部分的相应项目字符串。
● Clear/Copy/Cut/Paste:组合框编辑框部分的剪贴板操作函数。
● AddString:在组合框列表框的尾部添加一个字符串。
● InsertString:在组合框列表框中插入一个字符串。
● DeleteString:从组合框列表框中删除一个字符串。
● ResetContent:删除列表框中所有的项目。
组合框的控件通知消息有:CBN_DBLCLK(鼠标双击)、CBN_DROPDOWN(列表框被下拉)、CBN_SELCHANGE(列表框中选择的行发生改变)、CBN_EDITUPDATE(输入框中内容被更新)、CBN_CLOSEUP(列表框部分关闭)、CBN_EDITCHANGE(用户改变了编辑框的内容)等。
2.2.6 进度条
进度条用来显示一个长时间的操作进度,进度条的主要参数是它的范围(range)和当前进度位置(position),范围代表整个耗时操作,当前位置代表操作进行到了哪一步。进度条由类CProgressCtrl来管理,其成员函数如下:
● SetRange:用short类型的整数设置进度条范围。
● GetRange:获得进度条的范围。
● SetPos/GetPos:设置/获得进度条当前位置。
● OffsetPos:通过增量来设置进度条的进度位置。
● StepIt:在当前位置基础上增加一个增量并重新显示进度条,这个增量由SetStep函数设置。
进度条在一个线程中被控制,在一个耗时操作开始之前,调用SetRange设置范围,当操作进行到某一步时,程序调用SetPos、OffsetPos、StepIt让进度条显示新的位置。
2.3 通用对话框
作为操作界面的对话框的实现是由对话框模板资源和与之相关联的对话框类两部分组成的。其中对话框模板资源的作用是确定一个对话框的外形、尺寸、控件(用于交互操作)的组成、分布和标志。对话框类的作用是为该对话框提供属性和各种操作,以便在程序中需要使用该对话框提供操作界面时,创建该对话框类的对象,并通过该对象操作该对话框,实现在该对话框界面中进行所需要的交互操作。
Visual C++为程序中所需要的各类资源的制作提供了一个WYSWYG(即见即得)的资源编辑器。由该编辑器制作生成的所有资源都被以文本形式记录在一个的资源文件(.rc)中,例如,在本书的实例《简单人事信息管理程序》中的PersonnelMIS.rc。对话框模板的制作内容和步骤如下所示。
2.3.1 添加一个对话框模板
1.添加方法
在工作空间(Workspace)中选择ResourceView卷标,然后用鼠标右键单击工作空间中的总目录标题PersonnelMIS resource,弹出一个浮动菜单,如图2.3所示。
图2.3 浮动菜单
在该菜单中选择Insert…项,随后在主编辑窗口中弹出一个资源类型选择对话框,以便从中选定需要插入的资源如图2.4所示。
图2.4 资源类型选择对话框
在该对话框中用鼠标左键单击Dialog项(选中要插入的资源为对话框),然后单击按钮New或直接用鼠标左键双击Dialog项,即可在资源文件中加入一个默认的对话框范本(框架),如图2.5所示。
图2. 5 在资源文件中加入一个默认的对话框范本
在所显示的默认对话框模板中,可以按照你所设计的交互操作的需要,对添加的对话框模板进行必要的编辑。主要的编辑操作包括:修改对话框的标志和标题,修改对话框的尺寸,选择对话框中的字体,添加所需要的控件,编辑每个控件的标题、尺寸等,安排控件在对话框中的位置、布局和Tab键顺序等。下面以《简单人事信息管理程序》中的“人员信息选择对话框模板”为例,描述这些编辑操作。
(1)调整对话框模板的尺寸
使用鼠标移动光标对模板的右边框和下边框进行(按住鼠标左键)拖拽,可以将对话框模板的尺寸扩大或缩小到要求的大小。
(2)修改按钮控件<OK>和<Cancel>在对话框模板中的分布
先将要改变分布状态的<OK>和<Cancel>按钮控件全部选中,然后选择菜单命令Layout→Arrange Buttons→Bottom(快捷键Ctrl + Shift + B),将这两个按钮的分布从默认的右分布改为底分布,如图2.6所示。
图2.6 修改按钮控件在对话框模板中的分布
(3)修改对话框模板的标识和标题
选中对话框模板,单击鼠标右键,弹出如图2.7所示的环境菜单。
图2.7 环境菜单
在此菜单中选择菜单项Properties,弹出如图2.8所示的模板属性编辑对话框。
图2.8 模板属性编辑对话框
注意,由于该属性编辑对话框可以用于编辑对话框模板和模板中任何控件的属性,所以一般可以单击该属性编辑对话框右上角的保持按钮 使该按钮的形态变为 以便该属性编辑对话框用于对不同资源编辑时保持显示。
对话框模板IDD_DIALOG1属性的编辑操作如下:
① 将ID编辑框中的范本标志IDD_DIALOG1修改为IDD_PERSON_ID_SEL_DLG。
② 将Caption编辑框中的对话框模板标题“Dialog”修改为“人事信息选择对话框”。
③ 如果需要,可以单击<Font…>按钮选择对话框模板中所使用的字体。本例将范本中所有的文本字体选定为“宋体”9号字,如图2.9所示。
图2.9 编辑IDD_DIALOG1属性
注意:对话框模板标志的命名虽然是任意的,但推荐以IDD_为前缀,后面的部分按照见名知意的原则命名,例如,本例中的IDD_PERSON_ID_SEL_DLG(注意,大写)。对话框的属性很多,如果要了解这些属性的作用和修改方法,可以单击 有关按钮显示的帮助信息,这里不再一一介绍。
(4)添加需要的控件
在控件选择工具栏中选择所要添加的控件(移动光标在任意一个控件按钮的右下角停留片刻,便会显示该控件类型名称的卷标),便可以通过鼠标在对话框模板中绘制所选择的控件。在本例中,需要为对话框模板IDD_PERSON_ID_SEL_DLG添加两个静态文本框控件(Static Text)和一个文本编辑框控件(Edit Box)。控件的尺寸可以通过鼠标对控件的边框进行扩大或缩小完成,控件的分布位置可以通过鼠标拖拽放置在需要的位置,而控件的标志和标题也要通过属性编辑对话框进行修改(方法与对对话框模板属性的修改类似)。本例中的控件的添加过程如下所述。
① 添加静态文本框控件,用于显示操作提示。一般情况下静态文本框控件不需要修改默认的标志,只需要编辑其标题,本例中将该静态文本控件的标题编辑为“请输入要选择人员的身份证号”(注意,编辑时必须先选中要编辑的控件)。该静态文本框控件水平位置还可以通过选择菜单命令Layout→Center inDialog→Horizontal(快捷键Ctrl + Shift + F9)所指示的功能,将该控件放置在对话框水平方向的中央位置,如图2.10所示。
图2.10 设置静态文本框控件的位置
② 修改静态文本控件的标题为水平和垂直中央对齐的显示风格(Style),如图2.11所示。
图2.11 修改静态文本控件的标题风格
③ 添加文本编辑框控件,用于程序运行时,用户通过键盘输入要查询人员的身份证号。通过鼠标修改该文本编辑框控件的尺寸、分布位置(方法同前)。通过属性编辑对话框将文本编辑框控件的标志修改为IDC_ID(其他属性均使用默认属性),如图2.12所示。
图2.12 添加文本编辑框控件
④ 添加静态文本框控件,为用于输入身份证号的文本编辑框增加提示。该静态文本框控件的添加方法与前相同,将该静态文本框控件的标题修改为“身份证号”。
⑤ 通过菜单命令Layout→Align→Top Ctrl+Up Arrow或相应的工具栏按钮,使添加的静态文本框控件与所提示的文本编辑框控件顶边对齐。然后通过菜单命令Layout→Make Same Size→Height或相应的工具栏按钮,使这两个控件的垂直尺寸相同,如图2.13所示。
图2.13 设置控件的位置
以上所有添加的控件的ID(标志)、标题、类型和用途归纳在表2.1中。
表2.1 控件的ID(标志)、标题、类型和用途
注意:控件标志的命名虽然是任意的,但推荐以IDC_为前缀,后面的部分按照见名知意的原则命名,例如,本例中的IDC_ID(注意要大写)。上述添加控件的其他属性使用默认值。
至此,人员信息选择对话框模板资源的添加操作完成。
2.3.2 相关对话框类的定义
对话框模板只为GUI交互界面定义了界面的大小、用于交互操作的控件的种类、数量、分布位置等。而使用该交互界面进行各类操作是通过各种相应API(Application Programming Interface)功能函数实现的。在微软的Windows操作平台上使用MFC的面向对象的程序设计中,这些功能和描述对话框交互界面的属性被封装在一个被称为CDialog的基类中,该类为所有需要通过对话框界面进行的交互的类设计提供了与对应的对话框模板相关联的能力以及统一的操作界面。因此,用户自定义的对话框类只需要从CDialog中派生,然后根据所设计的交互操作的特殊性,适当地增加一些属性,成员函数和(或)对CDialog定义中的虚函数进行重新定义即可,大大方便了面向对象的程序设计。下面我们以“人员信息选择对话框模板”IDD_PERSON_ID_SEL_DLG相关联的自定义对话框类CPersonInfSelDlg为例叙述自定义对话框类的定义方法和步骤。
1.创建自定义对话框类
使用ClassWizard创建与一个指定的对话框模板相关联的自定义对话框类比较方便的方法是:在资源编辑器中,选中需要定义关联对话框的模板IDD_PERSON_ID_SEL_DLG,单击鼠标右键,弹出一个环境菜单,选择菜单项“ClassWizard…”,如图2.14所示。
图2.14 选择菜单项ClassWizard…
如果与该指定的对话框模板关联的对话框还没有创建,则会显示如图2.15所示的提示对话框。
图2.15 提示对话框
对于该提示,可能的响应可分为三种情况:
① 如果不准备创建一个以CDialog为基类的自定义对话框类与该对话框模板关联,而在程序中直接使用CDialog定义与该对话框模板关联的对话框对象,则单击<Cancel>按钮,退出该提示。
② 如果准备将该对话框模板与一个已经存在的自定义类相关联,则选中Select an existing class单选按钮后,单击<OK>按钮,在随后列出的已存在的自定义类中选择要关联的类。
③ 通常情况下,都会创建一个以CDialog为基类的自定义对话框类与该对话框模板关联,即在默认状态下(单选按钮Create a new class被选中),单击<OK>按钮,弹出如图2.16所示的创建新类的操作界面。
图2.16 创建新类的操作界面
在该界面中,要创建的自定义新类的默认基类是CDialog,默认范本是要关联的对话框模板。虽然基类的种类和关联的对话框模板也可以重新选择,但一般情况都使用默认选定。因此,创建新类的操作只需要在新类名(Name)的文本编辑框中输入欲定义的自定义对话框类的名称,在本例中该类名为CPersonInfSelDlg。如果不修改所创建类的源代码文件名,则该类的定义文件为PersonInfSelDlg.h,实现文件为PersonInfSelDlg.cpp。单击<OK>按钮,则将新创建的自定义对话框类的信息显示在如下MFC ClassWizard(类向导)操作界面中,以便对所创建的新对话框类进行各种成员的添加工作。退出此操作界面,可在工作区窗口的ClassView中查看到,此时CPersonInfSelDlg类的定义中只有类对象构造函数和一个重新定义的基类虚函数DoDataExchange,如图2.17所示。
图2.17 MFC ClassWizard操作界面
2.添加数据成员
对话框类的主要用途是提供信息交互的界面,而一个信息的交互都是通过某一个特定的控件实现的,例如,本例中的人员身份证号就是通过身份证号文本编辑框控件进行输入/输出交互操作的。因此,在自定义对话框类中,添加与交互控件相关联的数据成员,以便在程序中完成输入/输出交互操作,是十分必要的,一般情况下是必不可少的。为交互控件添加相关数据成员的操作是在类向导操作界面MFC ClassWizard中完成的,进入该界面的方法有两种:
① 在IDD_PERSON_ID_SEL_DLG模板上单击鼠标右键,弹出一个环境菜单,选择菜单项ClassWizard…。
② 通过主菜单命令View→ClassWizard。
在MFC ClassWizard中选中CPersonInfSelDlg类,并选择Member Variables标签,进入数据成员添加操作界面,如图2.18所示。
图2.18 数据成员添加操作界面
为文本编辑控件IDC_ID添加数据成员:选中该控件ID后,单击<Add Variable…>按钮或双击该控件ID,便进入添加数据成员操作界面(Add Member Variable),如图2.19所示。
图2.19 数据成员操作界面
为控件添加的数据成员有两类:
● 数值数据成员(Value)——用于数据交换(输入/输出)。
● 控件对象成员(Control)——用于对控件本身的操作。
本例中,只为文本编辑控件IDC_ID添加数值数据成员。所添加的数值数据成员的类型还可以根据通过该控件所交换的数据的需要有多种选择,如图2.20所示。
图2.20 数据类型的多种选择
在本例中,由于身份证号是字符串,所以选择CStirng类型最为方便。在数据成员名编辑框中为所添加的数据成员命名,例如,为IDC_ID添加的CString类型的数据成员命名为m_Id。单击<OK>按钮确认所添加的数据成员,退出操作界面,返回类向导操作界面(MFC ClassWizard),如图2.21所示。
图2.21 返回类向导操作界面
对于有些类型的数值数据成员,允许附加对数据的某些确认限定条件。例如,本例中对CString类型的数据成员m_Id设置了最大字符个数Maximum Characters为18个ASCII字符。注意,只有单击<OK>按钮结束MFC ClassWizard,才能保证前面的添加操作被确认,否则如果单击<Cancel>按钮结束MFC ClassWizard,则会使所本次做的添加操作全部被取消。表2.2中归纳了在自定义对话框中所添加数据对象的名称、关联控件、类型、限定和用途。
表2.2 数据对象的说明
一次成功数据成员添加操作,如添加m_Id,会导致该对话框的定义和实现文件中增加如下的代码:
① 在CPersonInfSelDlg的定义增加:
CString m_Id;
② 在成员函数CPersonInfSelDlg::DoDataExchange的定义中增加:
DDX_Text(pDX, IDC_ID, m_Id); // 根据 pDX 的交互方向:输入时将控件 IDC_ID // 中的字符串读入m_Id中,输出时将m_Id中保 // 存的字符串写入控件IDC_ID中。 DDV_MaxChars(pDX, m_Id, 18); // 确保通过 IDC_ID 交换的字符串长度不超过 18 // 个ASCII字符。
注意:成员函数DoDataExchange不能被直接调用,而是通过调用CDialog的成员函数UpdateData间接被调用。
UpdateData的原型如下:
BOOL UpdateData( BOOL bSaveAndValidate = TRUE ); 参数bSaveAndValidate = TRUE时,数据从控件读到与控件相关的数据成员中; 参数bSaveAndValidate = FALSE时,数据从数据成员写到与数据成员相关的控件中。
③ 在构造函数的定义中增加:
m_Id = _T(""); // 对数据成员的初始化设置
3.添加成员函数
自定义对话框类中是否需要添加其他成员函数,是由该对话框在创建、显示、操作中的特定需要确定的。在自定义对话框类添加的成员函数大致可以分为以下四种。
(1)重载基类的虚函数
用于对话框统一界面消息的多态响应时,实现自定义对话框的特定操作。这类函数的典型是DoDataExchange。如果需要重载基类的其他虚函数,则可以通过下述方法和步骤。
① 在ClassView中,通过选中类的环境菜单选择添加该类的基类虚函数,如图2.22所示。
图2.22 添加该类的基类虚函数
② 在弹出的虚函数重载界面中,选择要重载的基类虚函数,如图2.23所示。
图2.23 选择要重载的基类虚函数
选中要重载的基类虚函数(该函数从左侧窗口移动到右侧窗口)后,单击<Edit Existing>按钮进入被重载的虚函数的定义的编辑窗口,以便为该函数添加代码。
(2)对话框窗口的消息响应函数
这类函数的典型是对话框窗口初始化消息响应函数OnInitDialog。添加该函数的目的是在对话框窗口创建成功且对话框显示之前,对对话框中的控件进行特定的初始化。图2.24以OnInitDialog的添加为例,展示这类函数的添加方法和步骤:
① 在MFC ClassWizard界面中的“Class name:”类名选择栏中,选定需要添加窗口消息响应函数的类,例如,CPersonInfSelDlg。在“Object IDs:”对象标志列表中选择被选中的类名CPersonInfSelDlg。
② 在MFC ClassWizard界面中的“Message:”消息列表窗口中,选择要响应的窗口消息。例如,WM_INITDIALOG。
③ 单击<Add Function>按钮或双击选中的消息项,便会在“Member Functions”成员函数列表窗口中增加了该消息的响应函数。例如,OnInitDialog。
④ 单击<Edit Code>按钮,进入消息响应函数定义的编辑窗口(如图2.24所示),以便为该函数添加代码。
图2.24 添加消息响应函数OnInitDialog
(3)控件的消息响应函数
以<OK>按钮的消息响应函数为例说明这类函数的添加方法和步骤:
① 在MFC ClassWizard界面中的“Class name:”类名选择栏中,选定需要添加控件消息响应函数的类,例如,CPersonInfSelDlg。在“Object IDs:”物件标志列表中选择被选中控件的标志,如IDOK,如图2.25所示。
图2.25 选择控件标志
② 在MFC ClassWizard界面的“Message:”消息列表窗口中,选择要响应的控件消息,例如BN_CLICKED(按钮单击消息)。
③ 单击<Add Function>按钮或双击选中的消息项,便会弹出一个添加消息响应函数的对话框,如图2.26所示。
图2.26 添加消息响应函数
④ 单击对话框的<OK>按钮确定添加,则会在下方的“Member functions”成员函数列表窗口中增加了该消息的响应函数,如OnOk。
⑤ 单击<Edit Code>按钮,进入消息响应函数定义的编辑窗口,以便为该函数添加代码。