MFC对话框和常用控件__第1页
MFC对话框和常用控件__第2页
MFC对话框和常用控件__第3页
MFC对话框和常用控件__第4页
MFC对话框和常用控件__第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第5章对话框和常用控件章对话框和常用控件 5.1 对话框的使用对话框的使用 5.2 控件的创建和使用方法控件的创建和使用方法作业作业1 5.3 常用控件常用控件 5.4 通用对话框和消息对话框通用对话框和消息对话框 作业作业25.1对话框的使用对话框的使用5.1.15.1.1模式和无模式对话框模式和无模式对话框 模式对话框模式对话框 u指当对话框被弹出,用户必须在对话框中作出相应的操作,在退出对话框指当对话框被弹出,用户必须在对话框中作出相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。之前,对话框所在的应用程序不能继续执行。u无模式对话框无模式对话框 u指当对话框被弹出后,一

2、直保留在屏幕上,可继续在对话框所在的应用程指当对话框被弹出后,一直保留在屏幕上,可继续在对话框所在的应用程序中进行其它操作;需要使用对话框时,单击对话框所在的区域即可激活。序中进行其它操作;需要使用对话框时,单击对话框所在的区域即可激活。在创建和退出对话框窗口时的方式不同在创建和退出对话框窗口时的方式不同: :u创建时,模式对话框由系统自动分配内存空间,对话框退出时,对话框对创建时,模式对话框由系统自动分配内存空间,对话框退出时,对话框对象自动删除。无模式对话框需要来指定内存,退出时还需删除对话框对象。象自动删除。无模式对话框需要来指定内存,退出时还需删除对话框对象。u退出时,两种对话框所使用

3、的终止函数不一样。模式对话框通过调用退出时,两种对话框所使用的终止函数不一样。模式对话框通过调用CDialog: EndDialogCDialog: EndDialog来终止,无模式对话框则是调用来终止,无模式对话框则是调用CWnd:DestroyWindowCWnd:DestroyWindow来终止。来终止。u函数函数CDiaolog:OnOKCDiaolog:OnOK和和CDiaolog:OnCancelCDiaolog:OnCancel是调用是调用EndDialogEndDialog的,因此无模的,因此无模式对话框必须用式对话框必须用DestroyWindowDestroyWindow来

4、重载来重载OnOK OnOK 和和OnCancelOnCancel两个函数。两个函数。u需要正确删除表示对话框的对象。对模式对话框,在创建函数返回后即可需要正确删除表示对话框的对象。对模式对话框,在创建函数返回后即可删除对象。无模式对话框不是同步的,在创建函数调用后立即返回,因而删除对象。无模式对话框不是同步的,在创建函数调用后立即返回,因而不知道何时删除对象,但可以通过重载不知道何时删除对象,但可以通过重载CWnd:PostNcDestroyCWnd:PostNcDestroy函数并执行清函数并执行清除操作。除操作。 5.1对话框的使用对话框的使用5.1.2使用对话框编辑器使用对话框编辑器

5、打开对话框编辑器打开对话框编辑器 将项目工作区窗口切换到将项目工作区窗口切换到ResourceView页面,双击页面,双击Dialog目录下任意一目录下任意一个对话框个对话框ID。或者,选择。或者,选择“Insert”“Resource”菜单命令菜单命令(或按快捷键或按快捷键Ctrl+R),选择,选择Dialog项,单击项,单击New。 图图5.1 打开的对话框编辑器打开的对话框编辑器控件工具栏布局工具栏默认对话框资源ID号默认对话框模板基准线标尺5.1对话框的使用对话框的使用在对话框中添加和编辑控件在对话框中添加和编辑控件 (1)控件添加的方法控件添加的方法 在对话框中添加一个控件的方法有下

6、列几种:在对话框中添加一个控件的方法有下列几种:u在控件工具栏中单击某控件,鼠标箭头在对话框内变成在控件工具栏中单击某控件,鼠标箭头在对话框内变成“十十”字形状;在对话框指字形状;在对话框指定位置单击鼠标左键,再拖动选择框可改变控件的大小和位置。定位置单击鼠标左键,再拖动选择框可改变控件的大小和位置。u在控件工具栏中单击某控件,鼠标箭头对话框内变成在控件工具栏中单击某控件,鼠标箭头对话框内变成“十十”字形状;在指定位置处字形状;在指定位置处单击鼠标左键不放,拖动鼠标至满意位置,释放鼠标键。单击鼠标左键不放,拖动鼠标至满意位置,释放鼠标键。u用鼠标左键点中控件工具栏中的某控件,并按住鼠标键不放;

7、在移动鼠标到对话框用鼠标左键点中控件工具栏中的某控件,并按住鼠标键不放;在移动鼠标到对话框的指定位置的过程中,会看到一个虚线框,下面带有该控件的标记;释放鼠标键。的指定位置的过程中,会看到一个虚线框,下面带有该控件的标记;释放鼠标键。 控件的选择静态文本组框复选框组合框水平滚动条旋转按钮滑动条列表视图标签复合编辑月历用户定制工具静态图片编辑框按钮单选框列表框垂直滚动条进展条热键树形视图动画日期选择IP地址组合框的扩展图图5.2 控件工具栏和各按钮含义控件工具栏和各按钮含义5.1对话框的使用对话框的使用(2)单个控件的选取单个控件的选取鼠标选取鼠标选取 保证选择按钮保证选择按钮( )是被选中的,

8、移动鼠标指针至指定的控件上,单击鼠标左键。是被选中的,移动鼠标指针至指定的控件上,单击鼠标左键。助记符选取助记符选取 在相应的控件上右击。选择在相应的控件上右击。选择“Properties”菜单项,对话框中的菜单项,对话框中的“Caption”框是用来框是用来输入控件的标题,在标题中的某个字母之前键入输入控件的标题,在标题中的某个字母之前键入“&”符号,则该字母就是此控件的助记符。符号,则该字母就是此控件的助记符。Tab键选取键选取 利用利用Tab键,可在对话框内的控件中进行选择。每按一次键,可在对话框内的控件中进行选择。每按一次Tab键依次选取对话框中的键依次选取对话框中的下一个控件

9、,若按住下一个控件,若按住Shift键,再单击键,再单击Tab键则选取上一个控件。键则选取上一个控件。 (3)多个控件的选取多个控件的选取 u在对话框内按住鼠标左键不放,拖出一个大的虚框,释放鼠标,则被该虚框所包围的控件在对话框内按住鼠标左键不放,拖出一个大的虚框,释放鼠标,则被该虚框所包围的控件都将被选取。都将被选取。u先按住先按住Shift键不放,用鼠标选取控件,直到所需要的多个控件选取之后再释放键不放,用鼠标选取控件,直到所需要的多个控件选取之后再释放Shift键。键。若在选取时,对已选取的控件再选取一下,则该控件取消选取。若在选取时,对已选取的控件再选取一下,则该控件取消选取。u一旦单

10、个控件被选取后,其四周由选择框包围着,选择框上还有几个一旦单个控件被选取后,其四周由选择框包围着,选择框上还有几个(通常是八个通常是八个)蓝色实蓝色实心小方块,拖动它可改变控件的大小,如图。心小方块,拖动它可改变控件的大小,如图。u多个控件被选取后,其中只有一个控件的选择框有几个蓝色实心小方块,这个控件称为主多个控件被选取后,其中只有一个控件的选择框有几个蓝色实心小方块,这个控件称为主要控件,而其他控件的选择框的小方块是空心的。如图。要控件,而其他控件的选择框的小方块是空心的。如图。(b)图图5.3 单个控件和多个控件的选择框单个控件和多个控件的选择框(a)5.1对话框的使用对话框的使用(4)

11、控件的移动、删除和复制控件的移动、删除和复制当单个控件或多个控件被选取后,按方向键或用鼠标拖动控件的选择框可移动控件。若在鼠标拖动过程中还按住Ctrl键则复制控件。若按Del键可将选取的控件删除。 (5)设定控件的设定控件的Tab键次序键次序一是改变用Tab键选择控件的次序,二是当两个或两个以上的控件构成一组时,需要它们的Tab键次序连续。对话框内控件的Tab键次序设定步骤如下:u首先,选择选择“Layout”“Tab Order”命令,或按命令,或按Ctrl+D,此时每个控件的左上方都有一个数字,表明了当前Tab键次序,如图。u其次,按新的次序依次用鼠标单击各个控件,新的Tab键即可生成。u

12、最后,单击对话框或按Enter键结束Tab Order 方式。图图5.4 控件的控件的Tab键次序键次序5.1对话框的使用对话框的使用对话框内的控件的布局对话框内的控件的布局 图图5.6 Layout菜单命令项菜单命令项 靠 齐 上 边 左右间隔相等 大小相同靠齐左边上下居中宽度相同 显示标尺 靠 齐 右 边 左 右 居 中 高度相同测 试 对 话 框 靠 齐 下 边 上 下 间 隔 相 等显示网格图图5.5 控件布局工具栏控件布局工具栏5.1对话框的使用对话框的使用u大多布置控件的命令使用前,需要选取多个控件,且大多布置控件的命令使用前,需要选取多个控件,且“主要控件主要控件”起到了起到了关

13、键作用。多个控件的布置过程中,常需要重新设置关键作用。多个控件的布置过程中,常需要重新设置“主要控件主要控件”。设置。设置的方法是按住的方法是按住Ctrl或或Shift键,用鼠标单击所要指定的控件。键,用鼠标单击所要指定的控件。u系统提供了网格、标尺等辅助工具。在图系统提供了网格、标尺等辅助工具。在图5.5的控件布局工具栏的最后两个的控件布局工具栏的最后两个按钮分别用作网格和标尺的切换。一旦网格显示,添加或移动控件时都将按钮分别用作网格和标尺的切换。一旦网格显示,添加或移动控件时都将自动定位在网格线上。自动定位在网格线上。“Layout”菜单下的菜单下的“Guide Settings”命令提供

14、命令提供了设置网格单元大小的功能,如图。了设置网格单元大小的功能,如图。测试对话框测试对话框图图5.7 Guide Settings对话框对话框5.1对话框的使用对话框的使用5.1.3对话框的编程对话框的编程 添加对话框资源添加对话框资源 选择选择“Insert”“Resource”菜单命令菜单命令(或按或按Ctrl+R),若单击,若单击Dialog项左项左边的边的“+”号,将展开对话框资源的不同类型选项,如图。号,将展开对话框资源的不同类型选项,如图。 图图5.8 “Insert Resource”对话框对话框OLE:object linking and Embedding,即对象链接与嵌入

15、技术即对象链接与嵌入技术5.1对话框的使用对话框的使用改变对话框的属性改变对话框的属性 在对话框模板的非控件的区域内左击,用下列方式之一打开属性对话框:在对话框模板的非控件的区域内左击,用下列方式之一打开属性对话框:u选择选择“View”菜单菜单“Properties”命令或按命令或按Alt+Enter健健(3种方法种方法)。u用鼠标右击对话框模板,选取用鼠标右击对话框模板,选取Properties命令。命令。如图,如图,General是对话框属性的默认显示页面,其中列有对话框的标识符是对话框属性的默认显示页面,其中列有对话框的标识符名称框、标题框等,具体说明如表。名称框、标题框等,具体说明如

16、表。图图5.9 属性对话框属性对话框5.1对话框的使用对话框的使用向对话框内添加控件向对话框内添加控件 添加一个类添加一个类 在对话框模板的非控件的区域内双击,如图的对话框。在对话框模板的非控件的区域内双击,如图的对话框。 单击单击OK,弹出如图的对话框。可以为对话框资源定义一个新类名。,弹出如图的对话框。可以为对话框资源定义一个新类名。 图图5.11 “Adding a Class”对话框对话框图图5.12 “New Class”对话框对话框5.1对话框的使用对话框的使用消息映射消息映射 单击OK按钮,出现“MFC ClassWizard”对话框,如图。 图图5.13 “MFC ClassW

17、izard”对话框对话框5.1对话框的使用对话框的使用选定选定IDC_BUTTON1的的BN_CLICKED,双击左键或单击,双击左键或单击Add Function按钮,如图。按钮,如图。对话框中,可以为添加的成员函数名重新定义,单击对话框中,可以为添加的成员函数名重新定义,单击OK。选定成员函数。选定成员函数OnButton1项,双击左键或单击项,双击左键或单击Edit Code按钮,在此成员函数添加代按钮,在此成员函数添加代码。码。 u不同资源对象不同资源对象(控件、菜单命令等控件、菜单命令等)的消息是不相同的。例如,按钮控件的消息是不相同的。例如,按钮控件IDC_BUTTON1的消息有两

18、个:的消息有两个:BN_CLICKED和和BN_DOUBLECLICKED,分别表示当用户单击或双击该按钮时产生的消息。分别表示当用户单击或双击该按钮时产生的消息。u一般不需要对图一般不需要对图5.10对话框中的对话框中的OK(确定确定)与与Cancel(取消取消)按钮进行消按钮进行消息映射,因为系统已自动设置了这两个按钮的动作,当用户单击这两个按息映射,因为系统已自动设置了这两个按钮的动作,当用户单击这两个按钮都将自动关闭对话框。钮都将自动关闭对话框。 图图5.14 “Add Member Function”对话框对话框5.1对话框的使用对话框的使用添加用户代码添加用户代码 (1)在头文件在

19、头文件(MyDlg.h文件文件)中声明消息处理函数中声明消息处理函数OnButton1:protected:/AFX_MSG(CMyDlg)afx_msg void OnButton1();/AFX_MSG(2)在在MyDlg.cpp源文件开头部分的消息映射入口,添加消息映射宏:源文件开头部分的消息映射入口,添加消息映射宏:BEGIN_MESSAGE_MAP(CMyDlg, CDialog)/ 消息映射开消息映射开始始/AFX_MSG_MAP(CMyDlg)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)/AFX_MSG_MAPEND_MESSAGE_MAP()/ 消

20、息映射结束消息映射结束表明消息及其处理函数之间的联系。单击按钮控件表明消息及其处理函数之间的联系。单击按钮控件IDC_BUTTON1时,系统将自动时,系统将自动调用调用OnButton1函数。函数。(3)在在MyDlg.cpp文件中写入一个空的消息处理函数的模板,以便用户填入具体代文件中写入一个空的消息处理函数的模板,以便用户填入具体代码,如下面的框架:码,如下面的框架:void CMyDlg:OnButton1() / TODO: Add your control notification handler code here5.1对话框的使用对话框的使用在程序中使用对话框在程序中使用对话框

21、(1)利用项目工作区的利用项目工作区的ClassView标签项,将标签项,将Ex_SDIHello.cpp源文件打源文件打开;开;(2)在在Ex_SDIHello.cpp源文件的前面加上包含类源文件的前面加上包含类CMyDlg的头文件:的头文件:#include MyDlg.h(3)在在InitInstance函数体中的函数体中的“return TRUE;”语句之前添加下列代码:语句之前添加下列代码:CMyDlg dlg;dlg.DoModal();DoModal是模式对话框最常用的函数,它负责对话框的显示和终止。是模式对话框最常用的函数,它负责对话框的显示和终止。(4)编译并运行。在程序的一

22、开始就出现用户自己设计的对话框,单击编译并运行。在程序的一开始就出现用户自己设计的对话框,单击Button1按钮将弹出按钮将弹出“欢迎进入对话框的设计!欢迎进入对话框的设计!”的消息对话框来。的消息对话框来。5.2控件的创建和使用方法控件的创建和使用方法 5.2.1控件的创建方法控件的创建方法 控件的创建方式有以下两种:控件的创建方式有以下两种:一种是在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指一种是在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指定为对话框,这样做的好处是明显的,因为当应用程序启动该对话框时,定为对话框,这样做的好处是明显的,因为当应用程序启动该对话框

23、时,Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清系统就会为对话框创建控件;而当对话框消失时,控件也随之清除。除。另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的Create函数来创建。函数来创建。例例Ex_SDIHello 在上例在上例Ex_SDIHello的基础上用子窗口方式创建控件。的基础上用子窗口方式创建控件。(1)打开打开CMyDlg的头文件的头文件MyDlg.h,添加一个按钮类,添加一个按钮类CButton指针变量:指针变量:class CMyDlg : public CDialog/ Co

24、nstructionpublic:CMyDlg(CWnd* pParent = NULL); / standard constructorCButton *m_btnWnd;/动态创建动态创建 5.2控件的创建和使用方法控件的创建和使用方法(2)按按Ctrl+W快捷键打开对话框,切换到快捷键打开对话框,切换到Message Maps页面,在页面,在Object IDs列表中选定列表中选定“CMyDlg”项,并在项,并在Message列表中找到列表中找到WM_INITDIALOG消息,双击鼠标左键,然后单击消息,双击鼠标左键,然后单击Edit Code按钮,添按钮,添加下列代码:加下列代码:BO

25、OL CMyDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herem_btnWnd = new CButton();/ 构造按钮控件构造按钮控件m_btnWnd -Create(你好你好, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,CRect(20, 20, 120, 60), this, 201); / 创建创建CFont *font = this-GetFont();/ 获取对话框的字体获取对话框的字体m_btnWnd-SetFont(font);/ 设

26、置控件字设置控件字体体return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSECreate用来创建一个按钮控件,第一个参数指定按钮的标题,第二个参数用来创建一个按钮控件,第一个参数指定按钮的标题,第二个参数指定控件的风格,第三个参数指定它在父窗口中的位置和大小,第四个参指定控件的风格,第三个参数指定它在父窗口中的位置和大小,第四个参数指定父窗口指针,最后一个参数是指定该控件的标识值。数指定父窗口指针,最后一个参数是指定该

27、控件的标识值。(3)编译并运行,编译并运行, 5.2控件的创建和使用方法控件的创建和使用方法5.2.2控件的数据交换和数据校验控件的数据交换和数据校验 例如,为例如,为CMyDlg类的按钮控件类的按钮控件IDC_BUTTON1添加并使用其成员变量添加并使用其成员变量m_MyBtn,则其相应的过程如下:,则其相应的过程如下:(1)启动启动MFC ClassWizard,切换到,切换到Member Variables页面,如图。页面,如图。(2)选定选定Class name为为CMyDlg,然后在,然后在Control IDs列表中,选定所要关列表中,选定所要关联的控件联的控件ID号号IDC_BU

28、TTON1,双击鼠标左键或单击,双击鼠标左键或单击Add Variable按钮,按钮,如图。如图。 图图5.16 ClassWziard的的“Member Variables”页面页面图图5.17 “Add Member Variable”对话框对话框5.2控件的创建和使用方法控件的创建和使用方法(3)在在Member variable name框中填好与控件相关联的成员变量,单击框中填好与控件相关联的成员变量,单击OK,在,在Control IDs列表中出现刚才添加的内容。列表中出现刚才添加的内容。需要说明的是,需要说明的是,uDDV/DDX技术中,允许为同一个控件关联多个数据成员变量,但必

29、须保技术中,允许为同一个控件关联多个数据成员变量,但必须保证这些变量名是互不相同的,且这些变量在同一个类型不能有多个变量。证这些变量名是互不相同的,且这些变量在同一个类型不能有多个变量。u如果添加的成员变量是一个数值类型,则在如果添加的成员变量是一个数值类型,则在Mm_MyBtnFC ClassWizard对话框的对话框的Member Variables页面下方还要求用户输入变量的范围,这就页面下方还要求用户输入变量的范围,这就是控件的数据校验设置。是控件的数据校验设置。(4)单击单击OK,发现,发现ClassWizard作了以下三方面的修改。作了以下三方面的修改。u在在MyDlg.h文件中,

30、添加与控件关联的成员变量的声明,代码如下:文件中,添加与控件关联的成员变量的声明,代码如下:/ Dialog Data/AFX_DATA(CMyDlg)enum IDD = IDD_DIALOG1 ;CButton m_MyBtn;/控件型变量,即控件型变量,即CButton类的对象类的对象CString m_strEdit;/字符串变量字符串变量/AFX_DATA 5.2控件的创建和使用方法控件的创建和使用方法u在在MyDlg.cpp文件中的文件中的CMyDlg构造函数实现代码处,添加数据成员变构造函数实现代码处,添加数据成员变量的初始代码:量的初始代码:CMyDlg:CMyDlg(CWnd

31、* pParent /*=NULL*/): CDialog(CMyDlg:IDD, pParent)/AFX_DATA_INIT(CMyDlg)m_strEdit = _T();/AFX_DATA_INITu在在MyDlg.cpp文件中的文件中的DoDataExchange函数体内,添加控件的函数体内,添加控件的DDX/DDV代码。代码。void CMyDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/ 调用此函数作为调用此函数作为DDX的开始的开始/AFX_DATA_MAP(CMyDlg)DDX_Contro

32、l(pDX, IDC_BUTTON1, m_MyBtn);DDX_Text(pDX, IDC_EDIT1, m_strEdit);DDV_MaxChars(pDX, m_strEdit, 20); /AFX_DATA_MAP5.2控件的创建和使用方法控件的创建和使用方法(5)为一个控件定义一个关联的数据成员变量后,就可以使用为一个控件定义一个关联的数据成员变量后,就可以使用CWnd:UpdateData函数实现控件的控制,包括控件相关数据的输入和读函数实现控件的控制,包括控件相关数据的输入和读取。在取。在OnButton1()函数中添加如下代码:函数中添加如下代码:CWnd* pWnd = G

33、etDlgItem(IDC_BUTTON1);GetDlgItemText(IDC_EDIT1,m_strEdit);SetDlgItemText(IDC_BUTTON1,m_strEdit);运行该程序,当在编辑框中输入运行该程序,当在编辑框中输入“Hello”后,单击后,单击Button1按钮,则此时按钮,则此时该按钮的名称就变成了编辑框控件中的内容该按钮的名称就变成了编辑框控件中的内容“Hello”,如图。,如图。 图图5.19 使用控件的数据成员变量使用控件的数据成员变量5.2控件的创建和使用方法控件的创建和使用方法5.2.3控件的通用属性控件的通用属性 图图5.20 按钮控件的属性对

34、话框按钮控件的属性对话框5.2控件的创建和使用方法控件的创建和使用方法5.2.4控件的消息控件的消息 控件的编程和使用过程中,可以向控件发送消息来完成特定的任务,或者控件的编程和使用过程中,可以向控件发送消息来完成特定的任务,或者是根据控件产生的消息执行自己的代码。是根据控件产生的消息执行自己的代码。应用程序创建一般控件或公共控件之后,控件的状态发生改变时,控件就应用程序创建一般控件或公共控件之后,控件的状态发生改变时,控件就会向其父窗口发送消息,这个消息称为会向其父窗口发送消息,这个消息称为“通知消息通知消息”。对于每个消息,系。对于每个消息,系统都会用一个统都会用一个MSG结构来记录,结构

35、来记录,MSG具有下列结构:具有下列结构:typedef struct tagMSG / msg HWND hwnd; / 接收到消息的窗口句柄接收到消息的窗口句柄 UINT message;/ 消息消息 WPARAM wParam; / 消息的附加信息,它的含义取决于消息的附加信息,它的含义取决于message LPARAM lParam;/ 消息的附加信息,它的含义取决于消息的附加信息,它的含义取决于message DWORD time; / 消息传送时的时间消息传送时的时间 POINT pt;/ 消息传送时,光标的屏幕坐标消息传送时,光标的屏幕坐标 MSG; 对于一般控件来说,通知消息通

36、常是一条对于一般控件来说,通知消息通常是一条WM_COMMAND消息,这条消消息,这条消息的息的wParam参数的低位字中含有控件标识符,参数的低位字中含有控件标识符,wParam参数的高位字则参数的高位字则为通知代码,为通知代码,lParam参数则是指向控件的句柄。参数则是指向控件的句柄。5.2控件的创建和使用方法控件的创建和使用方法对于公共控件,通知消息通常是一条对于公共控件,通知消息通常是一条WM_NOTIFY消息,消息,wParam参数是发参数是发送通知消息的控件的标识符,送通知消息的控件的标识符,lParam参数是指向参数是指向NMHDR结构的指针。对于结构的指针。对于有些控件的通知

37、消息,有些控件的通知消息,lParam参数是指向一个更大的结构,且结构中的第一参数是指向一个更大的结构,且结构中的第一个成员还必须具有个成员还必须具有NMHDR结构。结构。 对于控件的对于控件的WM_COMMAND或是或是WM_NOTIFY消息,都可以用消息,都可以用ClassWizard对它们加以映射。对它们加以映射。 尽管控件的各自通知消息并不相同,但下列的通知消息是所有尽管控件的各自通知消息并不相同,但下列的通知消息是所有Windows控件控件所共有的:所共有的:NM_CLICK 在控件中单击鼠标左按钮在控件中单击鼠标左按钮NM_DBLCLK 在控件中双击鼠标左按钮在控件中双击鼠标左按钮

38、NM_RCLICK 在控件中单击鼠标左按钮在控件中单击鼠标左按钮NM_RDBLCLK 在控件中双击鼠标右按钮在控件中双击鼠标右按钮NM_RETURN 当控件具有输入焦点时按下当控件具有输入焦点时按下ENTER键键NM_SETFOCUS 控件得到输入焦点控件得到输入焦点NM_KILLFOCUS 控件失去输入焦点控件失去输入焦点NM_OUTOFMEMORY 没有足够的内存使控件完成操作没有足够的内存使控件完成操作 5.3常用控件常用控件 根据控件的特性和功能,一般可将其分为三类:根据控件的特性和功能,一般可将其分为三类:Windows公共控件、公共控件、ActiveX控件以及控件以及MFC新增的一

39、些控件等。新增的一些控件等。 5.3常用控件常用控件5.3.1静态控件和按钮静态控件和按钮 静态控件静态控件 一个静态控件是用来显示一个字符串、框、矩形、图标、位图或增强的图元文一个静态控件是用来显示一个字符串、框、矩形、图标、位图或增强的图元文件。它可以被用来作为标签、框或用来分隔其它的控件。一个静态控件一般不件。它可以被用来作为标签、框或用来分隔其它的控件。一个静态控件一般不接收用户输入,也不产生通知消息。接收用户输入,也不产生通知消息。在对话框编辑器的控件工具栏中,属于静态控件的有:静态文本在对话框编辑器的控件工具栏中,属于静态控件的有:静态文本( )、组框、组框( )和静态图片和静态图

40、片( )三种。三种。 图图5.21 静态图片控件的静态图片控件的General和和Style属性对话框属性对话框5.3常用控件常用控件按钮按钮 (1)按键按钮按键按钮通常可以立即产生某个动作,执行某个命令,常被称为命令按钮。两种风通常可以立即产生某个动作,执行某个命令,常被称为命令按钮。两种风格:标准按键按钮和默认按键按钮。从外观上来说,默认按键按钮是在标格:标准按键按钮和默认按键按钮。从外观上来说,默认按键按钮是在标准按键按钮的周围加上一个黑色边框,这个黑色边框表示该按钮已接受到准按键按钮的周围加上一个黑色边框,这个黑色边框表示该按钮已接受到键盘的输入焦点,只须按回车键就能按下该按钮。具体设

41、定的方法是在按键盘的输入焦点,只须按回车键就能按下该按钮。具体设定的方法是在按键按钮属性对话框的键按钮属性对话框的Style页面中选中页面中选中“Default button”项。项。(2)单选按钮单选按钮外形是在文本前有一个圆圈,被选中时,就标上一个黑点,可分为一般和外形是在文本前有一个圆圈,被选中时,就标上一个黑点,可分为一般和自动两种类型。自动类型中,若选中同组按钮中的某个单选按钮,则其余自动两种类型。自动类型中,若选中同组按钮中的某个单选按钮,则其余的单选按钮的选中状态就会清除,保证了多个选项始终只有一个被选中。的单选按钮的选中状态就会清除,保证了多个选项始终只有一个被选中。(3)复选

42、框复选框外形是在文本前有一个空心方框,被选中时,复选框中就加上一个外形是在文本前有一个空心方框,被选中时,复选框中就加上一个“ ”标记,三态复选框还有种处于灰框状态,表示标记,三态复选框还有种处于灰框状态,表示“不确定不确定”。设定成三态复。设定成三态复选框的方法是在复选框属性对话框的选框的方法是在复选框属性对话框的Style页面中选中页面中选中“Tri-state”项。项。 图图5.22 按钮的不同类型按钮的不同类型三态复选框5.3常用控件常用控件按钮的消息按钮的消息 常见的只有两个:常见的只有两个:BN_CLICKEDBN_CLICKED和和BN_DOUBLE_CLICKEDBN_DOUB

43、LE_CLICKED。 按钮选中操作按钮选中操作 u最常用的按钮操作是设置或获取一个或多个按钮的选中状态。最常用的按钮操作是设置或获取一个或多个按钮的选中状态。CButtonCButton类的类的成员函数成员函数SetCheckSetCheck和和GetCheckGetCheck设置或获取指定按钮的选中状态,原型:设置或获取指定按钮的选中状态,原型:void SetCheck( int void SetCheck( int nChecknCheck ); );int GetCheck( ) const; int GetCheck( ) const; nChecknCheck和和GetCheck

44、GetCheck函数返回的值可以是:函数返回的值可以是:0 0表示不选中,表示不选中,1 1表示选中,表示选中,2 2表示表示不确定不确定( (仅用于三态按钮仅用于三态按钮) )。 u对于多个单选按钮的选中状态的设置或获取,需要使用对于多个单选按钮的选中状态的设置或获取,需要使用CWndCWnd类的成员函数类的成员函数CheckRadioButtonCheckRadioButton和和GetCheckedRadioButtonGetCheckedRadioButton,原型:,原型:void CheckRadioButton( int void CheckRadioButton( int nI

45、DFirstButtonnIDFirstButton, int , int nIDLastButtonnIDLastButton, int , int nIDCheckButtonnIDCheckButton ); );int GetCheckedRadioButton( int int GetCheckedRadioButton( int nIDFirstButtonnIDFirstButton, int , int nIDLastButtonnIDLastButton ); );nIDFirstButtonnIDFirstButton和和nIDLastButtonnIDLastButton

46、指定这组单选按钮的第一个和最后一个按指定这组单选按钮的第一个和最后一个按钮钮IDID值,值,nIDCheckButtonnIDCheckButton指定要设置选中状态的按钮指定要设置选中状态的按钮IDID值,函数值,函数GetCheckedRadioButtonGetCheckedRadioButton返回被选中的按钮返回被选中的按钮IDID值。值。 5.3常用控件常用控件 例例Ex_Ctrls1 Ex_Ctrls1 用静态图片、单选按钮、复选框和按键按钮控件,设计界面。用静态图片、单选按钮、复选框和按键按钮控件,设计界面。开始,所有单选按钮都是灰显的,不能选择,选中开始,所有单选按钮都是灰显

47、的,不能选择,选中“允许允许”复选框后,所有单复选框后,所有单选按钮可以使用,选定一个单选框后,单击选按钮可以使用,选定一个单选框后,单击 应用应用 。(1)(1)用用MFC AppWizard(exe)MFC AppWizard(exe)创建一个名为创建一个名为Ex_CommCtrlsEx_CommCtrls的基于对话框的应用程的基于对话框的应用程序。在创建的第一步,将应用程序类型选择为序。在创建的第一步,将应用程序类型选择为Dialog BasedDialog Based,按,按FinishFinish。自。自动显示出该程序的对话框资源模板内容。动显示出该程序的对话框资源模板内容。(2)(

48、2)打开属性对话框将其标题改为打开属性对话框将其标题改为“使用使用WindowsWindows常用控件常用控件”。(3)(3)用编辑器为对话框添加如下表所示的一些控件。用编辑器为对话框添加如下表所示的一些控件。(4)(4)四个单选按钮的四个单选按钮的TabTab次序应连续,从次序应连续,从IDC_RADIO1IDC_RADIO1到到IDC_RADIO4IDC_RADIO4依次增加。依次增加。 (5)(5)按按Ctrl+WCtrl+W快捷键,切换到快捷键,切换到Member VariablesMember Variables页面,在页面,在Class nameClass name中选择中选择CE

49、x_CommCtrlstDlgCEx_CommCtrlstDlg,选中复选框控件,选中复选框控件IDID号号IDC_CHECK1IDC_CHECK1,双击鼠标或单击,双击鼠标或单击Add Add VariablesVariables按钮。按钮。 5.3常用控件常用控件(6)(6)切换到切换到ClassWizardClassWizard的的Messsage MapsMesssage Maps页面,为复选框页面,为复选框IDC_CHECK1IDC_CHECK1和按钮和按钮IDC_BUTTON1IDC_BUTTON1增加增加BN_CLICKEDBN_CLICKED的消息映射,添加代码:的消息映射,添

50、加代码:void CEx_CommCtrlsDlg:OnCheck1() void CEx_CommCtrlsDlg:OnCheck1() UpdateData();UpdateData();for (int i=0; i4; i+)for (int i=0; iEnableWindow(m_bEnabled);GetDlgItem(IDC_RADIO1 + i)-EnableWindow(m_bEnabled); void CEx_CommCtrlsDlg:OnButton1() void CEx_CommCtrlsDlg:OnButton1() UpdateData();UpdateDat

51、a();if (!m_bEnabled) return;if (!m_bEnabled) return;int nID = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO4);int nID = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO4);if (nID = IDC_RADIO1)if (nID = IDC_RADIO1) MessageBox(1); MessageBox(1); if (nID = IDC_RADIO2)if (nID = IDC_RADIO2) MessageBox(2); Messa

52、geBox(2); if (nID = IDC_RADIO3) if (nID = IDC_RADIO3) MessageBox(3);MessageBox(3); if (nID = IDC_RADIO4) if (nID = IDC_RADIO4) MessageBox(4);MessageBox(4); 5.3常用控件常用控件(7)(7)定位到定位到CEx_CommCtrlsDlg:OnInitDialogCEx_CommCtrlsDlg:OnInitDialog函数体中,添加下列代码:函数体中,添加下列代码:BOOL CEx_CommCtrlsDlg:OnInitDialog()BOO

53、L CEx_CommCtrlsDlg:OnInitDialog() CDialog:OnInitDialog();CDialog:OnInitDialog();CheckRadioButton(IDC_RADIO1, IDC_RADIO4, IDC_RADIO1); /CheckRadioButton(IDC_RADIO1, IDC_RADIO4, IDC_RADIO1); /设置设置第一个单选按钮为选中第一个单选按钮为选中OnCheck1(); OnCheck1(); return TRUE; / return TRUE unless you set the focus to a retur

54、n TRUE; / return TRUE unless you set the focus to a controlcontrol (8)(8)编译并运行。编译并运行。图图5.23 按钮示例运行结果按钮示例运行结果5.3常用控件常用控件5.3.2编辑框编辑框 编辑框的属性和风格编辑框的属性和风格 图图5.24 编辑框的属性对话框编辑框的属性对话框5.3常用控件常用控件 编辑框的基本操作 (1)口令设置默认的口令字符是“*”,应用程序可以用成员函数CEdit:SetPasswordChar 来定义自己的口令字符,其函数原型如下:void SetPasswordChar( TCHAR ch );

55、 (2)选择文本用鼠标来选择文本的操作方法用鼠标来选择文本的操作方法:在要选择的文本的一端按下鼠标左键并拖动鼠标,到另一端释放鼠标键。用键盘来选择文本的方法:用键盘来选择文本的方法:在按光标方向移动键的同时,按住Shift键。应用程序中可以通过编程选择文本,需要通过调用成员函数CEdit:SetSel 来实现。与该函数相对应的还有CEdit:GetSel和CEdit:ReplaceSel,分别用来获取编辑框中选择的开始和结束的位置以及替换被选择的文本。(3)设置编辑框的页面边距设置编辑框的页面边距可以使文本在编辑框显示更具满意效果,应用程序可通过调用成员函数CEdit:SetMargins来实

56、现,函数原型:void SetMargins( UINT nLeft, UINT nRight );(4)剪帖板操作编辑框自动支持文本的复制、粘贴、剪切的键盘操作,对应的快捷健为Ctrl+C、Ctrl+V和Ctrl+X。若应用程序调用CEdit:Undo函数时,还可撤消当前的操作,再调用一次该函数,则恢复刚才的操作。 5.3常用控件常用控件(5)获取多行编辑框文本一种是使用DDX/DDV,将编辑框控件所关联的变量类型选定为CString后,则不管多行编辑框的文本有多少都可用此变量来保存。这种方法不能单独获得多行编辑框中的某一行文本。另一种方法是使用编辑框CEdit类的相关成员函数来获取文本。例

57、如,下面的代码将显示编辑框中第二行的文本内容:char str100;if (m_Edit.GetLineCount()=2) / 判断多行编辑框的文本是否有两行以上int nChars;nChars = m_Edit.LineLength(m_Edit.LineIndex(1);/ 获取第二行文本的字符个数/ 0表示第一行,1表示第二行,依次类推。LineIndex用于将文本行转换成/ 能被LineLength识别的索引m_Edit.GetLine(1,str,nChars);/ 获取第二行文本strnChars = 0;MessageBox(str); 5.3常用控件常用控件编辑框的通知消

58、息例Ex_Ctrls2 使用静态文本、组框、编辑框以及按钮等控件,设计界面。用户在“成绩1”、“成绩2”和“成绩3”编辑框中输入成绩后,单击计算平均分按钮,将显示出这三个成绩的平均分。(1)打开前面的Ex_CommCtrls。(2)向应用程序中添加一个对话框资源,打开属性对话框将其标题改为“使用编辑框”,ID号改为IDD_EDIT。(3) 用编辑器为对话框添加如下表所示的一些控件。(4)双击对话框模板或按Ctrl+W快捷键,为对话框资源IDD_EDIT创建一个对话框类CEditDlg。 5.3常用控件常用控件(5)打开ClassWizard的Member Variables标签,在Class

59、name中选择CEditDlg,选中所需的控件ID号,双击鼠标或单击Add Variables按钮。依次为控件增加成员变量。 (6)切换到ClassWizard的Messsage Maps标签页,为CEditDlg增加WM_INITDIALOG的消息映射,并添加下列代码:BOOL CEditDlg:OnInitDialog() CDialog:OnInitDialog();m_strAve = 0.00;UpdateData(FALSE);/ 将成员变量数据传给控件,并在控件中显示return TRUE; 5.3常用控件常用控件(7)用ClassWziard为按钮IDC_BUTTON1添加BN

60、_CLICKED的消息映射,并增加下列代码:void CEditDlg:OnButton1() UpdateData();/ 将控件显示的数据传给成员变量double ave = (double)(m_nScore1+m_nScore2+m_nScore3)/3.0;m_strAve.Format(%6.2f, ave);UpdateData(FALSE);/ 将成员变量数据传给控件并显示(8)定位到CEx_CommCtrlsDlg:OnButton1函数处,修改代码如下:if (nID = IDC_RADIO1) CEditDlg dlg;dlg.DoModal();(9)在Ex_CommCtrlsDlg.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论