




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第4章章 对话框和常用控件对话框和常用控件对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段。在程序运行过程中,对话框可用于捕捉用户的输入信息或数据。对话框是一个特殊类型的窗口,任何对窗口进行的操作(如移动、最大化、最小化等)也可在对话框中实施。一般来说,在对话框中通过各种控件(如按钮、编辑框、列表框、组合框等)来和用户进行交互,控件是在系统内部定义的用于和用户交互的基本单元。4.1 对话框的使用对话框的使用在Visual C+ 6.0应用程序中,使用一个对话框的一般过程是:添加对话框资源;设置对话框的属性;添加和布局控件;创建对话框类;添加对话框代码;在程序中
2、调用对话框。4.1.1 资源与资源标识资源与资源标识1. 资源的分类资源的分类先用MFC AppWizard创建一个单文档应用程序Ex_SDI,然后项目工作区窗口切换到“ResourceView”页面,展开所有的节点,如图4.1所示。图4.1 Ex_SDI资源视图资源类别资源标识符1. 资源的分类资源的分类可以看出,一个单文档应用程序所使用的资源可分为下列几类:(1) 快捷键列表(Accelerator)。一系列组合键的集合,被应用程序用来引发一个动作。该列表一般与菜单命令相关联,用来代替鼠标操作。(2) 对话框(Dialog)。含有按钮、列表框、编辑框等各种控件的窗口。(3) 图标(Icon
3、)。代表应用程序显示在Windows桌面上的位图,它同时有32x32像素和16x16像素两种规格。(4) 菜单(Menu)。用户通过菜单可以完成应用程序的大部分操作。(5) 字串表(String Table)。应用程序使用的全局字符串或其他标识符。(6) 工具栏按钮(Toolbar)。工具栏外观是以一系列具有相同尺寸的位图组成的,它通常与一些菜单命令相对应,用以提高用户的工作效率。(7) 版本信息(Version)。包含应用程序的版本、用户注册码等相关信息。除了上述常用资源类别外,Visual C+ 6.0应用程序中还可有鼠标指针、HTML等,也可以自己添加新的资源类别。4.1.1 资源与资源
4、标识资源与资源标识2. ID标识符标识符一般地,要遵循下列规则:在标识符名称中允许使用字母az、AZ、09以及下划线。标识符名称不区分大小写字母,如new_idd与New_Idd是相同的标识符。不能以数字开头,如8BIT是不合法的标识符名。除了上述规则外,出于习惯,Visual C+还提供了一些常用的定义标识符名称的前缀供用户使用、参考,见表4.1。4.1.2 添加对话框资源添加对话框资源在一个MFC应用程序中添加对话框资源,通常按下列步骤进行:(1) 选择“插入”“资源”菜单,或按快捷键Ctrl+R打开“插入资源”对话框,在对话框中可以看到资源列表中存在Dialog项,若单击Dialog项左
5、边的“+”号,将展开对话框资源的不同类型选项,如图4.2所示,表4.2列出各种类型的对话框资源的不同用途。图4.2 “插入资源”对话框4.1.2 添加对话框资源添加对话框资源表表4.2 对话框资源类型对话框资源类型其中,新建按钮是用来创建一个由“资源类型”列表中指定类型的新资源,定制按钮是用来创建“资源类型”列表中没有的新类型的资源,导入按钮是用于将外部已有的位图、图标、光标或其他定制的资源添加到当前应用程序中。4.1.2 添加对话框资源添加对话框资源(2) 对展开的不同类型的对话框资源不作任何选择,选中“Dialog”,单击新建按钮,系统就会自动为当前应用程序添加了一个对话框资源,并出现如图
6、4.3所示的界面。对话框模板控件工具栏布局工具栏默认标识符图4.3 添加对话框资源后的开发环境4.1.3 设置对话框属性设置对话框属性在对话框模板处右击鼠标,从弹出的快捷菜单中选择“属性”菜单项,出现如图4.4所示的对话框属性窗口。图4.4 对话框属性窗口4.1.3 设置对话框属性设置对话框属性可以看出,对话框的属性有General(一般)、Styles(风格)、More Styles(更多风格)、Extended Styles(扩展风格)、More Extended Styles(更多扩展风格)等部分,这里仅介绍最常用的General属性,如表4.3所示。表表4.3 对话框的对话框的Gene
7、ral属性属性4.1.3 设置对话框属性设置对话框属性将添加的对话框的属性进行以下3点修改,结果如图4.5所示: 将对话框标识符改成IDD_DIALOG_FIRST; 将对话框标题改为“我的第一个对话框”; 单击字体按钮,通过弹出的字体对话框将对话框内的文本设置成“宋体,9” ,以使自己的对话框和Windows中的对话框保持外观上的一致。图4.5 对话框属性修改后的界面4.1.4 添加和布局控件添加和布局控件一旦对话框资源被打开或被创建,就会出现对话框编辑器,通过它可以在对话框中进行控件的添加和布局等操作。1. 控件的添加控件的添加对话框编辑器最初打开时,控件工具栏是随之出现的,利用此工具栏中
8、的各个按钮可以顺利完成控件的添加。图4.6说明了各个按钮所对应的控件类型。控件的选择静态文本组框复选框组合框水平滚动条旋转按钮滑动条列表视图标签复合编辑月历用户定制控件静态图片编辑框按钮单选框列表框垂直滚动条进展条热键树形视图动画日期选择IP地址扩展组合框图4.6 控件工具栏和各按钮含义4.1.4 添加和布局控件添加和布局控件在对话框中添加一个控件的方法有下列几种: 在控件工具栏中单击某控件,此时的鼠标箭头在对话框内变成“十”字形状;在对话框指定位置单击鼠标左键,则此控件被添加到对话框的相应位置,再拖动刚添加控件的选择框可改变其大小和位置。 在控件工具栏中单击某控件,此时的鼠标箭头对话框内变成
9、“十”字形状;在指定位置处单击鼠标左键不放,拖动鼠标至满意位置,释放鼠标键。 用鼠标左键点中控件工具栏中的某控件,并按住鼠标左键不放;在移动鼠标到对话框的指定位置的过程中,用户会看到一个虚线框,下面带有该控件的标记;释放鼠标左键,新添加的控件立即出现在对话框中。4.1.4 添加和布局控件添加和布局控件2. 控件的选取控件的选取控件的删除、复制和布局操作一般都要先选取控件,若选取单个控件,则可以下列方法: 用鼠标直接选取。首先保证在控件工具栏中的选择按钮()是被选中的,然后移动鼠标指针至指定的控件上,单击鼠标左键即可。 用助记符来选取。如果控件的标题中带有下划线的字符,这个字符就是助记符,选择时
10、直接按下该助记符键或“Alt+助记符”组合键即可。 用Tab键选取。在对话框编辑器中,系统会根据控件的添加次序自动设置相应的Tab键次序。利用Tab键,用户可在对话框内的控件中进行选择。每按一次Tab键依次选取对话框中的下一个控件,若按住Shift键,再单击Tab键则选取上一个控件。对于多个控件的选取,可采用下列方法: 先在对话框内按住鼠标左键不放,拖出一个大的虚框,然后释放鼠标,则被该虚框所包围的控件都将被选取。 先按住Shift键不放,然后用鼠标选取控件,直到所需要的多个控件选取之后再释放Shift键。若在选取时,对已选取的控件再选取一下,则取消该控件选取。4.1.4 添加和布局控件添加和
11、布局控件需要注意的是:(1) 一旦单个控件被选取后,其四周由选择框包围着,选择框上还有几个(通常是八个)蓝色实心小方块,拖动它可改变控件的大小,如图4.7(a)所示。(2) 多个控件被选取后,其中只有一个控件的选择框有几个蓝色实心小方块,这个控件称为主要控件,而其他控件的选择框的小方块是空心的。如图4.7(b)所示。图4.7 单个控件和多个控件的选择框(a)(b)4.1.4 添加和布局控件添加和布局控件3. 控件的删除、复制和布局控件的删除、复制和布局当单个控件或多个控件被选取后,按方向键或用鼠标拖动控件的选择框可移动控件。若在鼠标拖动过程中还按住Ctrl键则复制控件。若按Del键可将选取的控
12、件删除。当然还有其他一些编辑操作,但这些操作方法和一般的文档编辑器基本相同,这里不再重复。对于控件的布局,对话框编辑器中提供了控件布局工具栏,如图4.8所示,它可以自动地排列对话框内的控件,并能改变控件的大小。图4.8 控件布局工具栏3. 控件的删除、复制和布局控件的删除、复制和布局与布局工具相对应的菜单命令在“编排”菜单下,而且大部分命令均有相应的快捷键,如图4.9所示。表4.4还列出菜单命令及其相应的功能与快捷键描述。“编排”菜单不是在Visual C+ 6.0开发环境一开始就出现的,而是随着对话框编辑器的打开而显示的。图4.9 “编排”菜单命令项表表4.4 “编排编排”菜单命令的快捷键及
13、功能描述菜单命令的快捷键及功能描述4.1.4 添加和布局控件添加和布局控件4. 测试对话框测试对话框“编排”菜单下的Test命令或布局工具栏上的测试按钮是用来模拟所编辑的对话框的运行情况,帮助用户检验对话框是否符合用户的设计要求以及控件功能是否有效等。5. 操作示例操作示例下面来向对话框添加一个静态文本控件。一个静态文本控件就是一个文本标签,如图4.10所示。右击添加的控件,从弹出的快捷菜单中选择“属性”,出现如图4.11所示的属性对话框。图4.10 添加的静态文本控件 图4.11 静态文本控件的属性对话框 4.1.5 创建对话框类创建对话框类在对话框资源模板的空白区域(没有其他元素或控件)内
14、双击鼠标,将弹出如图4.12所示的对话框,询问是否为对话框资源创建一个新类。单击OK按钮,将弹出如图4.13所示的New Class对话框。在Name框中输入类名CFirstDlg。Base class和Dialog ID内容是由系统自动设置的,一般无需修改。从Base class框的内容可以看出,用户对话框类是从基类CDialog派生而来的。单击OK按钮,一个基于对话框资源模板的对话框类CFirstDlg就创建好了。此时,出现MFC ClassWizard(MFC类向导)对话框。 图4.12 “Adding a Class”对话框图4.13 “New Class”对话框4.1.6 添加对话框
15、代码添加对话框代码在MFC ClassWizard对话框,查看“Class name”列表中是否选择了CFirstDlg,若不是,则在IDs列表中选择CFirstDlg。在Messages框中找到并选定WM_INITDIALOG消息,如图4.14。 图4.14 “MFC ClassWizard”对话框4.1.6 添加对话框代码添加对话框代码在Member functions列表框中选择刚添加的OnInitDialog函数,单击Edit Code按钮(或直接在函数名双击鼠标),将自动出现该函数代码编辑窗口,在此函数中添加下列代码:BOOL CFirstDlg:OnInitDialog() CDi
16、alog:OnInitDialog();/ TODO: Add extra initialization hereCStatic* pWnd = (CStatic*)GetDlgItem(IDC_STATIC_1);pWnd-SetWindowText(这是我的第一个对话框!);return TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE代码中,CStatic是静态文本控件的MFC类,SetWindowText是CWnd的一
17、个成员函数,用来设置窗口的文本内容,由于控件类是CWnd的子类(派生类),因此可以使用基类的SetWindowText来改变静态文本控件显示的内容。GetDlgItem也是CWnd类的一个成员函数,用来获得对话框中控件(参数是控件的ID标识符,这里是IDC_STATIC_1)的窗口指针。4.1.7 在程序中调用对话框在程序中调用对话框在项目工作区窗口中选择ResourceView页面,双击资源“Menu”项中的IDR_MAINFRAME,则菜单编辑器窗口出现在主界面的右边,相应的Ex_SDI项目的菜单资源被显示出来,在菜单的最右一项,Visual C+为用户留出了一个空位置,用来输入新的菜单项
18、,如图4.15所示。菜单的空位置图4.15 Ex_SDI菜单资源4.1.7 在程序中调用对话框在程序中调用对话框(2) 在菜单的空位置上双击鼠标左键,则出现它的属性对话框,在标题框中输入“测试(&T)”,结果如图4.16所示,其中符号&用来其后面的字符作为该菜单项的助记符,这样当按住“Alt”键不放,再敲击该助记符键时,对应的菜单项就会被选中,或在菜单打开时,直接按相应的助记符键,对应的菜单项也会被选中。图4.16 Ex_SDI菜单资源子菜单的空位置保存可见按钮4.1.7 在程序中调用对话框在程序中调用对话框(3) 单击菜单属性对话框中的“保存可见”(Keep Visible)按钮,使此属性对
19、话框一直可见。单击“测试”菜单项下方的空位置,在属性对话框中,输入标题“对话框(&D)”,在ID框输入该菜单项的资源标识:ID_TEST_DLG,结果如图4.17所示,单击属性对话框右上角的关闭按钮。(4) 单击“测试”菜单项并按住鼠标左键不放,移动鼠标,将“测试”菜单项移到“查看”和“帮助”菜单项之间,然后释放鼠标。结果如图4.18所示。图4.17 修改菜单项属性图4.18 菜单项“对话框”拖放后的位置4.1.7 在程序中调用对话框在程序中调用对话框(5) 按Ctrl+W快捷键,弹出MFC ClassWizard对话框。在Message Maps页面中,从Class name列表中选择CMa
20、inFrame,在IDs列表中选择ID_TEST_DLG,然后在Messages框中选择COMMAND消息。(6) 单击Add Function按钮或双击COMMAND消息,出现Add Member Function对话框,输入成员函数的名称。系统默认的函数名为OnTestDlg,如图4.19所示。该函数是对菜单项ID_TEST_DLG的映射,也就是说,当在应用程序运行时,用户选择“测试”“对话框”,则该函数OnTestDlg被调用,执行函数中的代码。图4.19 添加成员函数4.1.7 在程序中调用对话框在程序中调用对话框(7) 单击OK按钮,在ClassWizard的Member funct
21、ions列表中将列出新增加的成员函数。选择此函数,单击Edit Code按钮(或直接双击函数名),在此成员函数中添加下列代码:void CMainFrame:OnTestDlg() CFirstDlg dlg;/ 定义对话框类对象dlg.DoModal();/ 显示对话框代码中,DoModal是CDialog基类成员函数,用来将对话框按模式方式来显示。(8) 在OnTestDlg函数的实现文件MainFrm.cpp的前面添加CFirstDlg类的包含语句,即:#include Ex_SDI.h#include MainFrm.h#include FirstDlg.h4.1.7 在程序中调用对话
22、框在程序中调用对话框(9) 编译并运行。在应用程序菜单上,选择“测试”“对话框”菜单项,将出现如图4.20的对话框,这个对话框就是刚才添加的对话框。图4.20 对话框的显示4.1.8 使用无模式对话框使用无模式对话框对话框有两种类型,一种是模式对话框,另一是无模式对话框。1. 模式对话框模式对话框所谓“模式对话框”是指当对话框被弹出,用户必须在对话框中作出相应的操作,在退出对话框之前,对话框所在应用程序的其它操作不能继续执行。一般情况下,模式对话框会有OK(确定)和Cancel(取消)按钮。单出OK按钮,系统认定用户在对话框中的选择或输入有效,对话框退出;单击Cancel按钮,对话框中的选择或
23、输入无效,对话框退出,程序恢复原有状态。模式对话框的应用范围较广,上面示例中的对话框和平常所见到的大多数对话框都是模式对话框。2. 无模式对话框无模式对话框所谓“无模式对话框”是指当对话框被弹出后,一直保留在屏幕上,用户可继续在对话框所在的应用程序中进行其它操作;当需要使用对话框时,只需象激活一般窗口一样单击对话框所在的区域即可激活。4.1.8 使用无模式对话框使用无模式对话框下面在单文档应用程序Ex_SDI中创建并使用无模式对话框,其步骤如下:(1) 在该项目中添加一个对话框资源,将其标识符设为IDD_DIALOG_SECOND,标题设为“无模式对话框”,对话框字体和大小设为“宋体,9号”。
24、(2) 为IDD_DIALOG_SECOND对话框资源创建一个对话框类CSecondDlg。(3) 按Ctrl+W快捷键打开MFC ClassWizard,从“Class name”列表中选择CSecondDlg,在IDs列表中选择IDOK,它是对话框中OK按钮的标识符,然后在Messages框中选择BN_CLICKED(单击按钮)消息,单击Add Function按钮或双击BN_CLICKED消息,出现“Add Member Function”对话框以输入成员函数的名称,保留系统默认的函数名为OnOK,如图4.21所示。该函数是对OK按钮单击消息的映射,即当用户单击此对话框中的OK按钮时,O
25、nOK函数被执行。(4) 修改CSecondDlg:OnOK函数中的代码。void CSecondDlg:OnOK() DestroyWindow();/ 终止对话框显示delete this;/ 删除对话框,释放内存空间代码中,DestroyWindow是对话框基类CWnd的一个成员函数,用来终止窗口。图4.21 映射IDOK消息4.1.8 使用无模式对话框使用无模式对话框(5) 用MFC ClassWizard来添加Cancel按钮(标识符为IDCANCEL)的BN_CLICKED消息映射,并修改其映射函数CSecondDlg:OnCancel的代码。void CSecondDlg:OnC
26、ancel() DestroyWindow(); delete this;(6) 将项目工作区切换到ClassView(类视图)页面,展开CMainFrame类的所有成员,双击OnTestDlg就会在文档窗口中自动定位到该函数的实现代码处,将其修改成下列代码:void CMainFrame:OnTestDlg() CSecondDlg *pDlg = new CSecondDlg;/ 使用new来为对话框分配内存空间pDlg-Create( IDD_DIALOG_SECOND );/ 创建对话框pDlg-ShowWindow( SW_NORMAL );/ 显示对话框代码中,Create函数可以
27、用来以一个对话框资源来创建对话框,ShowWindow是CWnd一个成员函数,用来显示对话框,SW_NORMAL用来指定将窗口显示成一般常用的状态。4.1.8 使用无模式对话框使用无模式对话框(7) 在文件MainFrm.cpp的前面添加CSecondDlg类的包含语句,即:#include FirstDlg.h#include SecondDlg.h(8) 编译并运行。在应用程序菜单上,多次选择“测试”“对话框”菜单项,将会在同一个位置中出现多个对话框,拖动这些对话框到适当位置,如图4.22所示。图4.22 无模式对话框显示的结 4.2 控件的创建和使用方法控件的创建和使用方法控件是在系统内
28、部定义的能够完成特定功能的控制程序单元。在应用程序中使用控件不仅简化了编程,还能完成常用的各种功能。为了更好地发挥控件作用,用户还必须理解和掌握控件的属性、消息以及创建和使用的方法。4.2.1 控件的创建方法控件的创建方法控件的创建方式有以下两种:一种是在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指定为对话框,这样做的好处是明显的,因为当应用程序启动该对话框时,Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清除。另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的Create函数来创建。4.2.1 控件的创建方法控件的创建方法例例Ex_DlgCtrls
29、使用控件的编程方式来创建一个按钮使用控件的编程方式来创建一个按钮(1) 选择“文件”“新建”菜单,在弹出的新建对话框的项目类型列表中选择MFC AppWizard(exe)类型,在工程框中输入项目名Ex_DlgCtrls,结果如图4.23所示。图4.23 MFC AppWizard的“新建”对话框 4.2.1 控件的创建方法控件的创建方法(2) 单击确定按钮,在出现的“Step 1”对话框中选择“基本对话”应用程序类型,单击完成按钮,创建一个默认的基于对话框的应用程序项目。(3) 将项目工作区切换到ClassView页面,展开CEx_DlgCtrlsDlg类,右击CEx_DlgCtrlsDlg
30、类名,弹出如图4.24所示的快捷菜单。图4.24 弹出的快捷菜单4.2.1 控件的创建方法控件的创建方法4) 从快捷菜单中选择Add Member Variable(添加成员变量),在出现的对话框中定义一个CButton类对象m_btnWnd,通常以“m_”来作为变量的开头,表示“成员”(member)的意思。如图4.25所示,单击OK按钮。图4.25 添加成员变量4.2.1 控件的创建方法控件的创建方法(5) 在项目工作区窗口的ClassView页面中,双击OnInitDialog函数名,在该函数中添加下列代码:BOOL CEx_DlgCtrlsDlg:OnInitDialog()CDial
31、og:OnInitDialog(); m_btnWnd.Create(你好, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,CRect(20, 20, 120, 60), this, 201); / 创建CFont *font = this-GetFont();/ 获取对话框的字体m_btnWnd.SetFont(font);/ 设置控件字体return TRUE; / return TRUE unless you set the focus to a control由于OnInitDialog函数在对话框初始化时被调用,因此将对话框中的一些初始化代码都添加在此函
32、数中。代码中,Create用来创建一个按钮控件,该函数第一个参数用来指定该按钮的标题,第二个参数用来指定控件的风格,第三个参数用来指定它在父窗口中的位置和大小,第四个参数用来指定父窗口指针,最后一个参数是指定该控件的标识值。4.2.1 控件的创建方法控件的创建方法(6) 编译并运行,结果如图4.26所示。图4.26 控件创建的结果4.2.2 控件的消息及消息映射控件的消息及消息映射当控件的状态发生改变时,控件就会向其父窗口发送消息,这个消息称为“通知消息”。对于每个消息,系统都会用一个MSG结构来记录,MSG具有下列结构:typedef struct tagMSG / msg HWND hwn
33、d; / 接收到消息的窗口句柄 UINT message;/ 消息 WPARAM wParam;/ 消息的附加信息,它的含义取决于message LPARAM lParam;/ 消息的附加信息,它的含义取决于message DWORD time;/ 消息传送时的时间 POINT pt;/ 消息传送时,光标所在的屏幕坐标 MSG;对于一般控件来说,其通知消息通常是一条WM_COMMAND消息,这条消息的wParam参数的低位字中含有控件标识符,wParam参数的高位字则为通知代码,lParam参数则是指向控件的句柄。而对于有些控件,其通知消息通常是一条WM_NOTIFY消息,这条消息的wPara
34、m参数是发送通知消息的控件的标识符,而lParam参数则是指向一个结构指针。4.2.2 控件的消息及消息映射控件的消息及消息映射1. 映射控件消息映射控件消息 在MFC中,映射一个控件消息是非常简便的。例如下面的步骤是用来映射按钮命令消息。 打开Ex_DlgCtrls应用程序项目。将项目工作区窗口切换到ResourseView页面,双击Dialog资源下的标识IDD_EX_DLGCTRLS_DIALOG,打开该对话框资源模板。删除“TODO: 在这里设置对话控制。”控件,添加一个按钮控件,保留其默认属性。如图4.27所示。图4.27 添加一个按钮4.2.2 控件的消息及消息映射控件的消息及消息
35、映射(4) 按快捷键Ctrl+W,打开MFC ClassWizard对话框,查看“Class name”列表中是否选择了CEx_DlgCtrlsDlg,在IDs列表中选择IDC_BUTTON1,这是添加按钮后,系统自动为此按钮设置的默认标识符,然后在Messages框中选择BN_CLICKED消息。(5) 单击Add Function按钮或双击BN_CLICKED消息,出现“Add Member Function”对话框,在这里可以输入成员函数的名称,系统默认的函数名为OnButton1。如图4.28所示。图4.28 添加按钮消息映射函数4.2.2 控件的消息及消息映射控件的消息及消息映射(6
36、) 单击OK按钮,在MFC ClassWizard的“Member functions”列表中将列出新增加的成员函数。选择此函数,单击Edit Code按钮(或直接在函数名双击鼠标),开发环境的文档窗口中将自动打开该函数所在的源代码文件,并定位到该函数的实现代码处。在此成员函数中添加下列代码:void CEx_DlgCtrlsDlg:OnButton1() MessageBox(你按下了Button1按钮!);(7) 编译并运行,当单击Button1按钮时,就会执行OnButton1函数,弹出一个消息对话框。这就是按钮BN_CLICKED消息的映射过程,其他控件的消息也可以类似操作。4.2.2
37、 控件的消息及消息映射控件的消息及消息映射2. 映射控件通用消息映射控件通用消息上述过程是映射一个控件的某一个消息,事实上也可通过WM_COMMAND消息的映射来处理一个或多个控件的通用消息,如下面的步骤:打开MFC ClassWizard对话框,在“Class name”列表中是否选择了CEx_DlgCtrlsDlg,在IDs列表中选择CEx_DlgCtrlsDlg,在Messages框中找到并双击OnCommand,这样OnCommand消息函数就添加好了,如图4.29所示。 图4.29 添加OnCommand函数重载4.2.2 控件的消息及消息映射控件的消息及消息映射(2) 在OnCom
38、mand函数中添加下列代码:BOOL CEx_DlgCtrlsDlg:OnCommand(WPARAM wParam, LPARAM lParam) WORD nCode = HIWORD(wParam);/ 控件的通知消息WORD nID = LOWORD(wParam);/ 控件的ID值if (nID = 201)&(nCode = BN_CLICKED)MessageBox(你按下了你好按钮!);if (nID = IDC_BUTTON1)&(nCode = BN_CLICKED)MessageBox(这是在OnCommand处理的结果!);return CDialog:OnComman
39、d(wParam, lParam);注意:第一条if语句中,201是前面用Create创建按钮时指定的标识值。(3) 编译并运行。当单击如前图4.27所示的Button1按钮时,就会弹出一个消息对话框。4.2.3 控件的数据交换(DDX)和数据校验(DDV)使用MFC ClassWizard可以很容易地为一个控件定义关联变量并可设置其数据范围。例如,下面的步骤是为CEx_DlgCtrlsDlg类的按钮控件IDC_BUTTON1添加并使用其关联变量m_RelBtn。(1) 打开MFC ClassWizard,并切换到Member Variables页面,如图4.30所示。图4.30 “Membe
40、r Variables”页面4.2.3 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV)(2) 选定Class name为CEx_DlgCtrlsDlg,然后在Control IDs列表中,选定所要关联的控件ID标识符IDC_BUTTON1,双击鼠标左键或单击Add Variable按钮,弹出Add Member Variable对话框,在对话框设置变量的名称、类别和数据类型,如图4.31所示。图4.31 “Add Member Variable”对话框4.2.3 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV)(3) 在Member variable
41、name框中填好与控件相关联的成员变量m_RelBtn,单击OK按钮,又回到MFC ClassWizard对话框的Member Variables页面中,在Control IDs列表中出现刚才添加的控件关联变量(或直接称之为“控件变量”)。(4) 单击确定按钮后,打开CEx_DlgCtrlsDlg类源文件,可以发现MFC ClassWizard对上述操作作了以下三方面的修改。在Ex_DlgCtrlsDlg.h文件中,添加控件关联变量的声明,代码如下面的加粗部分:/ Dialog Data/AFX_DATA(CEx_DlgCtrlsDlg)enum IDD = IDD_EX_DLGCTRLS_D
42、IALOG ;/ 枚举类型CButtonm_RelBtn;CString m_strEdit;/AFX_DATA4.2.3 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV)在Ex_DlgCtrlsDlg.cpp文件中的CEx_DlgCtrlsDlg构造函数实现代码处,添加了控件变量的一些初始代码:CEx_DlgCtrlsDlg:CEx_DlgCtrlsDlg(CWnd* pParent /*=NULL*/): CDialog(CEx_DlgCtrlsDlg:IDD, pParent)/AFX_DATA_INIT(CEx_DlgCtrlsDlg)m_strEdit = _T(
43、);/AFX_DATA_INIT4.2.3 控件的数据交换控件的数据交换(DDX)和数据校验和数据校验(DDV)在Ex_DlgCtrlsDlg.cpp文件中的DoDataExchange函数体内,添加了控件的DDX/DDV代码,它们都是一些以DDV_或DDX_开头的函数调用。void CEx_DlgCtrlsDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX); / 调用此函数作为DDX的开始/AFX_DATA_MAP(CEx_DlgCtrlsDlg)DDX_Control(pDX, IDC_BUTTON1, m_R
44、elBtn); DDX_Text(pDX, IDC_EDIT1, m_strEdit); / 将IDC_EDIT1与m_strEdit进行数据交换DDV_MaxChars(pDX, m_strEdit, 20); / 校验m_strEdit的最大字符个数不超过20/AFX_DATA_MAP4.2.3 控件的数据交换(DDX)和数据校验(DDV)(5) 当为一个控件定义一个关联的数据变量后,就可以使用CWnd:UpdateData函数实现控件数据的输入和读取。例如,将CEx_DlgCtrlsDlg:OnButton1修改成下列代码:void CEx_DlgCtrlsDlg:OnButton1()
45、 UpdateData();/ 默认参数值是TRUEm_RelBtn.SetWindowText(m_strEdit);代码中,UpdateData函数只有一个为TRUE或FALSE的参数。当调用UpdateData(FALSE)时,数据由控件相关联的成员变量向控件传输,当调用UpdateData(TRUE)或不带参数的UpdateData时,数据从控件向相关联的成员变量复制。4.2.3 控件的数据交换(DDX)和数据校验(DDV)(6) 运行该程序,当在编辑框中输入“Hello”后,单击Button1按钮,OnButton1函数中的UpdateData将编辑框内容保存到m_strEdit变量
46、中,从而执行下一条语句后按钮的名称就变成了编辑框控件中的内容“Hello”,其结果如图4.33所示 图4.33 使用控件的数据成员变量4.3 常用控件常用控件根据控件的特性和功能,一般可将其分为三类:Windows公共控件、ActiveX控件以及MFC新增的一些控件等。表4.5列出了本书所用到的常用控件类。表表4.5 常用控件类常用控件类4.3.1 静态控件和按钮静态控件和按钮1. 静态控件静态控件一个静态控件是用来显示一个字符串、框、矩形、图标、位图或增强的图元文件。它可以被用来作为标签、框或用来分隔其它的控件。一个静态控件一般不接收用户输入,也不产生通知消息。在对话框编辑器的控件工具栏中,
47、属于静态控件的有:静态文本( )、组框( )和静态图片( )三种。其中,静态图片控件的一般属性对话框如图4.34所示。表4.6列出了其一般属性的各个项的含义。在属性对话框中,用户可以选择图片“类型”、“图像”两个组合框中的有关选项内容,并可将应用程序资源中的图标、位图等内容显示在该静态图片控件中。另外,用户还可设置其风格来改变控件的外观以及图像在控件的位置等。1. 静态控件静态控件图4.34 静态图片控件的General属性对话框表表4.6 静态图片控件的静态图片控件的General和和Style属性属性4.3.1 静态控件和按钮静态控件和按钮2. 按钮按钮在Windows中所用的按钮是用来实
48、现一种开与关的输入,常见的按钮有3种类型:按键按钮、单选按钮、复选框按钮,如图4.37所示。图4.37 按钮的不同类型4.3.1 静态控件和按钮静态控件和按钮2. 按钮按钮(1) 按键按钮。按键按钮通常可以立即产生某个动作,执行某个命令,因此也常被称为命令按钮。按键按钮有两种风格:标准按键按钮和默认按键按钮。 (2) 单选按钮。单选按钮的外形是在文本前有一个圆圈,当它被选中时,单选按钮中就标上一个黑点,它可分为一般和自动两种类型。在自动类型中,用户若选中同组按钮中的某个单选按钮,则其余的单选按钮的选中状态就会清除,保证了多个选项始终只有一个被选中。(3) 复选框。复选框的外形是在文本前有一个空
49、心方框,当它被选中时,复选框中就加上一个“”标记,通常复选框只有选中和未选中两种状态,若复选框前面有一个灰色是“ ”,则这样的复选框是三态复选框,如图4.37的Check2,它表示复选框的选择状态是“不确定”。设定成三态复选框的方法是在复选框属性对话框的Style页面中选中“(状态)Tri-state”项。 4.3.1 静态控件和按钮静态控件和按钮3. 按钮的消息按钮的消息在按钮映射的消息中,常见的只有两个:BN_CLICKED(单击按钮)和BN_DOUBLE- CLICKED(双击按钮)。4. 按钮选中操作按钮选中操作最常用的按钮操作是设置或获取一个按钮或多个按钮的选中状态。CButton类
50、的成员函数SetCheck和GetCheck分别用来设置或获取指定按钮的选中状态,其原型如下:void SetCheck( int nCheck );int GetCheck( ) const;其中,nCheck和GetCheck函数返回的值可以是:0表示不选中,1表示选中,2表示不确定(仅用于三态按钮)。而对于同组多个单选按钮的选中状态的设置或获取,需要使用通用窗口类CWnd的成员函数CheckRadioButton和GetCheckedRadioButton,它们的原型如下:void CheckRadioButton( int nIDFirstButton, int nIDLastButt
51、on, int nIDCheckButton );int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton );其中,nIDFirstButton和nIDLastButton分别指定同组单选按钮的第一个和最后一个按钮ID值,nIDCheckButton用来指定要设置选中状态的按钮ID值,函数GetCheckedRadioButton返回被选中的按钮ID值。4.3.1 静态控件和按钮静态控件和按钮5. 示例:制作问卷调查示例:制作问卷调查问卷调查是日常生活中经常遇到的调查方式。例如,图4.38就是一个问卷调查对话框,它针对“
52、上网”话题提出了三个问题,每个问题都有四个选项,除最后一个问题外,其余都是单项选择。图4.38 上网问卷调查对话框4.3.1 静态控件和按钮静态控件和按钮例例Ex_Research 制作问卷调查制作问卷调查1)创建并设计对话框创建并设计对话框(1) 创建一个默认的对话框应用程序Ex_Research。(2) Visual C+会自动打开对话框编辑器并显示对话框资源模板。单击对话框编辑器工具栏上的切换网格按钮,显示对话框网格,将对话框标题改为“上网问卷调查”。(3) 调整对话框的大小,删除对话框中间的“TODO: 在这里设置对话控制。”静态文本控件,将确定和取消按钮移至对话框的下方,并向对话框中
53、添加组框(Group)控件,然后调整其大小和位置。(4) 右击添加的组框控件,从弹出的快捷菜单中选择“属性”菜单,出现该控件的属性对话框,在属性对话框窗口中可以看到它的ID为默认的IDC_STATIC。将其Caption属性内容由“Static”改成“你的年龄”。在组框控件的Styles属性中,“水平对齐”属性用来指定文本在顶部的左边(Left)、居中(Center)还是右边(Right)。默认(Default)选项表示左对齐。4.3.1 例例Ex_Research 1)创建并设计对话框创建并设计对话框(5) 在组框内添加4个单选按钮,默认的ID依次为IDC_RADIO1、IDC_RADIO2
54、、IDC_RADIO3和IDC_RADIO4。在其属性对话框中将ID属性内容分别改成IDC_AGE_L18、IDC_AGE_18T27、IDC_AGE_28T38和IDC_AGE_M38,然后将其“标题”Caption属性内容分别改成“ 38”,最后调整位置,结果如图4.39所示。图4.39 添加的组框和单选按钮4.3.1 例例Ex_Research1)创建并设计对话框创建并设计对话框(6) 接下来添加一个静态文本,标题设为“你使用的接入方式:”,然后在其下再添加4个单选按钮,标题分别是“FTTL或ADSL”、“单位LAN”、“拨号56K”和“其他”,并将相应的ID属性依次改成:IDC_CM_
55、FTTL、IDC_CM_LAN、IDC_CM_56K和IDC_CM_OTHER。用对话框编辑器工具栏的按钮命令调整控件左右之间的间距,结果如图4.40所示。图4.40 再添加单选框图 4.3.1 例例Ex_Research1)创建并设计对话框创建并设计对话框(7) 在对话框的下方,再添加一个组框控件,其标题为“你上网主要是”。然后添加四个复选框,其标题分别为“收发邮件”、“浏览资料”、“聊天游戏”和“其他”,ID分别为IDC_DO_POP、IDC_DO_READ、IDC_DO_GAME和IDC_DO_OTHER。结果如图4.41所示。 图4.41 三个问题全部添加后的对话框 4.3.1 例例E
56、x_Research1)创建并设计对话框创建并设计对话框(8) 单击工具栏上的测试对话框按钮 。对话框测试后,可以发现:顺序添加的这8个单选按钮全部变成一组,也就是说,在这组中只有一个单选按钮被选中,这不符合我们的本意。解决这个问题的最好的办法是将每一组中的第一个单选按钮的Group(组)属性选中。(9) 分别将这二个问题中的第一个单选按钮的Group(组)属性均选中。如图4.42所示是对第二个问题设置的结果。图4.42 选中“Group”属性4.3.1 例例Ex_Research1)创建并设计对话框创建并设计对话框(10) 单击对话框编辑器工具栏上的切换辅助线按钮,然后将对话框中的控件调整到
57、辅助线以内,并适当对其他控件进行调整。这样,整个问卷调查的对话框就设计好了,单击工具栏上的测试对话框按钮 进行测试。 4.3.1 例例Ex_Research(2) 完善代码完善代码(1) 将项目工作区切换到ClassView(类视图)页面,展开CEx_ResearchDlg类的所有成员,双击OnInitDialog函数名就会在文档窗口中自动定位到该函数的实现代码处,在此函数添加下列初始化代码:BOOL CEx_ResearchDlg:OnInitDialog()CDialog:OnInitDialog(); CheckRadioButton(IDC_AGE_L18, IDC_AGE_M38,
58、IDC_AGE_18T27);CheckRadioButton(IDC_CM_FTTL, IDC_CM_OTHER, IDC_CM_FTTL);CButton* pBtn = (CButton*)GetDlgItem(IDC_DO_POP);pBtn-SetCheck(1);/ 使“收发邮件”复选框选中return TRUE; / return TRUE unless you set the focus to a control代码中,GetDlgItem是CWnd类的一个成员函数,用来获得对话框中控件(参数是控件的ID标识符)的窗口指针。4.3.1 例例Ex_Research(2) 完善代码
59、完善代码(2) 用MFC ClassWizard在CEx_ResearchDlg类中添加IDOK按钮的BN_CLICKED消息映射,并添加下列代码,使得用按确定按钮获取用户所作的选择内容。void CEx_ResearchDlg:OnOK() CString str, strCtrl;/ 定义两个字符串变量,CString是操作字符串的MFC类 / 获取第一个问题的用户选择str = 你的年龄:;UINT nID = GetCheckedRadioButton( IDC_AGE_L18, IDC_AGE_M38);GetDlgItemText(nID, strCtrl);/ 获取指定控件的标题
60、文本str = str + strCtrl; / 获取第二个问题的用户选择str = str + n你使用的接入方式:;nID = GetCheckedRadioButton( IDC_CM_FTTL, IDC_CM_OTHER);GetDlgItemText(nID, strCtrl);/ 获取指定控件的标题文本str = str + strCtrl; / 获取第三个问题的用户选择str = str + n你上网主要是:n;UINT nCheckIDs4=IDC_DO_POP, IDC_DO_READ, IDC_DO_GAME, IDC_DO_OTHER;CButton* pBtn;for
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中级技工(电工)考核试题及答案
- 光伏产业绿色产业布局与区域发展协调考核试卷
- 2024年云南省丽江市事业单位考试《职业能力倾向测验》真题及答案
- 2025儿童康复科技术操作规范及诊疗规范考核试题及答案
- 农产品电商平台用户行为与农产品供应链透明度研究考核试卷
- 中药品牌传播的社交媒体效应分析考核试卷
- 中医理疗器械的自动化技术考核试卷
- 年产塑料电力管700万米、通信管2000万米项目报告表
- 收入证明管理办法
- 旅行厕所管理办法
- 2025年上海市中考招生考试数学真题试卷(真题+答案)
- 2025年广东省中考英语试题卷(含答案解析)
- 2024年个人信用报告(个人简版)样本(带水印-可编辑)
- 16J914-1 公用建筑卫生间
- 苏教版五年级数学下册解方程五种类型50题
- 临床生物化学检验技术:第7章 糖代谢紊乱的生物化学检验
- 基于核心竞争力的战略管理研究课程
- 通达信与飞狐公式相互转换
- 纺织公司集落长车操作规范(F1520细纱机型)安全操作规程
- 二元一次方程组解法练习题精选含答案2
- 袁淑芳经验方
评论
0/150
提交评论