




已阅读5页,还剩129页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章对话框和常用控件,对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段。在程序运行过程中,对话框可用于捕捉用户的输入信息或数据。对话框是一个特殊类型的窗口,任何对窗口进行的操作(如移动、最大化、最小化等)也可在对话框中实施。一般来说,在对话框中通过各种控件(如按钮、编辑框、列表框、组合框等)来和用户进行交互,控件是在系统内部定义的用于和用户交互的基本单元。4.1对话框的使用在VisualC+6.0应用程序中,使用一个对话框的一般过程是:添加对话框资源;设置对话框的属性;添加和布局控件;创建对话框类;添加对话框代码;在程序中调用对话框。,4.1.1资源与资源标识,1.资源的分类先用MFCAppWizard创建一个单文档应用程序Ex_SDI,然后项目工作区窗口切换到“ResourceView”页面,展开所有的节点,如图4.1所示。,1.资源的分类,可以看出,一个单文档应用程序所使用的资源可分为下列几类:(1)快捷键列表(Accelerator)。一系列组合键的集合,被应用程序用来引发一个动作。该列表一般与菜单命令相关联,用来代替鼠标操作。(2)对话框(Dialog)。含有按钮、列表框、编辑框等各种控件的窗口。(3)图标(Icon)。代表应用程序显示在Windows桌面上的位图,它同时有32x32像素和16x16像素两种规格。(4)菜单(Menu)。用户通过菜单可以完成应用程序的大部分操作。(5)字串表(StringTable)。应用程序使用的全局字符串或其他标识符。(6)工具栏按钮(Toolbar)。工具栏外观是以一系列具有相同尺寸的位图组成的,它通常与一些菜单命令相对应,用以提高用户的工作效率。(7)版本信息(Version)。包含应用程序的版本、用户注册码等相关信息。除了上述常用资源类别外,VisualC+6.0应用程序中还可有鼠标指针、HTML等,也可以自己添加新的资源类别。,4.1.1资源与资源标识,2.ID标识符一般地,要遵循下列规则:在标识符名称中允许使用字母az、AZ、09以及下划线。标识符名称不区分大小写字母,如new_idd与New_Idd是相同的标识符。不能以数字开头,如8BIT是不合法的标识符名。除了上述规则外,出于习惯,VisualC+还提供了一些常用的定义标识符名称的前缀供用户使用、参考,见表4.1。,4.1.2添加对话框资源,在一个MFC应用程序中添加对话框资源,通常按下列步骤进行:(1)选择“插入”“资源”菜单,或按快捷键Ctrl+R打开“插入资源”对话框,在对话框中可以看到资源列表中存在Dialog项,若单击Dialog项左边的“+”号,将展开对话框资源的不同类型选项,如图4.2所示,表4.2列出各种类型的对话框资源的不同用途。,图4.2“插入资源”对话框,4.1.2添加对话框资源,表4.2对话框资源类型,其中,新建按钮是用来创建一个由“资源类型”列表中指定类型的新资源,定制按钮是用来创建“资源类型”列表中没有的新类型的资源,导入按钮是用于将外部已有的位图、图标、光标或其他定制的资源添加到当前应用程序中。,4.1.2添加对话框资源,(2)对展开的不同类型的对话框资源不作任何选择,选中“Dialog”,单击新建按钮,系统就会自动为当前应用程序添加了一个对话框资源,并出现如图4.3所示的界面。,图4.3添加对话框资源后的开发环境,4.1.3设置对话框属性,在对话框模板处右击鼠标,从弹出的快捷菜单中选择“属性”菜单项,出现如图4.4所示的对话框属性窗口。,图4.4对话框属性窗口,4.1.3设置对话框属性,可以看出,对话框的属性有General(一般)、Styles(风格)、MoreStyles(更多风格)、ExtendedStyles(扩展风格)、MoreExtendedStyles(更多扩展风格)等部分,这里仅介绍最常用的General属性,如表4.3所示。,表4.3对话框的General属性,4.1.3设置对话框属性,将添加的对话框的属性进行以下3点修改,结果如图4.5所示:将对话框标识符改成IDD_DIALOG_FIRST;将对话框标题改为“我的第一个对话框”;单击字体按钮,通过弹出的字体对话框将对话框内的文本设置成“宋体,9”,以使自己的对话框和Windows中的对话框保持外观上的一致。,图4.5对话框属性修改后的界面,4.1.4添加和布局控件,一旦对话框资源被打开或被创建,就会出现对话框编辑器,通过它可以在对话框中进行控件的添加和布局等操作。1.控件的添加对话框编辑器最初打开时,控件工具栏是随之出现的,利用此工具栏中的各个按钮可以顺利完成控件的添加。图4.6说明了各个按钮所对应的控件类型。,图4.6控件工具栏和各按钮含义,4.1.4添加和布局控件,在对话框中添加一个控件的方法有下列几种:在控件工具栏中单击某控件,此时的鼠标箭头在对话框内变成“十”字形状;在对话框指定位置单击鼠标左键,则此控件被添加到对话框的相应位置,再拖动刚添加控件的选择框可改变其大小和位置。在控件工具栏中单击某控件,此时的鼠标箭头对话框内变成“十”字形状;在指定位置处单击鼠标左键不放,拖动鼠标至满意位置,释放鼠标键。用鼠标左键点中控件工具栏中的某控件,并按住鼠标左键不放;在移动鼠标到对话框的指定位置的过程中,用户会看到一个虚线框,下面带有该控件的标记;释放鼠标左键,新添加的控件立即出现在对话框中。,4.1.4添加和布局控件,2.控件的选取控件的删除、复制和布局操作一般都要先选取控件,若选取单个控件,则可以下列方法:用鼠标直接选取。首先保证在控件工具栏中的选择按钮()是被选中的,然后移动鼠标指针至指定的控件上,单击鼠标左键即可。用助记符来选取。如果控件的标题中带有下划线的字符,这个字符就是助记符,选择时直接按下该助记符键或“Alt+助记符”组合键即可。用Tab键选取。在对话框编辑器中,系统会根据控件的添加次序自动设置相应的Tab键次序。利用Tab键,用户可在对话框内的控件中进行选择。每按一次Tab键依次选取对话框中的下一个控件,若按住Shift键,再单击Tab键则选取上一个控件。对于多个控件的选取,可采用下列方法:先在对话框内按住鼠标左键不放,拖出一个大的虚框,然后释放鼠标,则被该虚框所包围的控件都将被选取。先按住Shift键不放,然后用鼠标选取控件,直到所需要的多个控件选取之后再释放Shift键。若在选取时,对已选取的控件再选取一下,则取消该控件选取。,4.1.4添加和布局控件,需要注意的是:(1)一旦单个控件被选取后,其四周由选择框包围着,选择框上还有几个(通常是八个)蓝色实心小方块,拖动它可改变控件的大小,如图4.7(a)所示。(2)多个控件被选取后,其中只有一个控件的选择框有几个蓝色实心小方块,这个控件称为主要控件,而其他控件的选择框的小方块是空心的。如图4.7(b)所示。,4.1.4添加和布局控件,3.控件的删除、复制和布局当单个控件或多个控件被选取后,按方向键或用鼠标拖动控件的选择框可移动控件。若在鼠标拖动过程中还按住Ctrl键则复制控件。若按Del键可将选取的控件删除。当然还有其他一些编辑操作,但这些操作方法和一般的文档编辑器基本相同,这里不再重复。对于控件的布局,对话框编辑器中提供了控件布局工具栏,如图4.8所示,它可以自动地排列对话框内的控件,并能改变控件的大小。,图4.8控件布局工具栏,3.控件的删除、复制和布局,与布局工具相对应的菜单命令在“编排”菜单下,而且大部分命令均有相应的快捷键,如图4.9所示。表4.4还列出菜单命令及其相应的功能与快捷键描述。“编排”菜单不是在VisualC+6.0开发环境一开始就出现的,而是随着对话框编辑器的打开而显示的。,图4.9“编排”菜单命令项,表4.4“编排”菜单命令的快捷键及功能描述,4.1.4添加和布局控件,4.测试对话框“编排”菜单下的Test命令或布局工具栏上的测试按钮是用来模拟所编辑的对话框的运行情况,帮助用户检验对话框是否符合用户的设计要求以及控件功能是否有效等。5.操作示例下面来向对话框添加一个静态文本控件。一个静态文本控件就是一个文本标签,如图4.10所示。右击添加的控件,从弹出的快捷菜单中选择“属性”,出现如图4.11所示的属性对话框。,图4.10添加的静态文本控件,图4.11静态文本控件的属性对话框,4.1.5创建对话框类,在对话框资源模板的空白区域(没有其他元素或控件)内双击鼠标,将弹出如图4.12所示的对话框,询问是否为对话框资源创建一个新类。单击OK按钮,将弹出如图4.13所示的NewClass对话框。在Name框中输入类名CFirstDlg。Baseclass和DialogID内容是由系统自动设置的,一般无需修改。从Baseclass框的内容可以看出,用户对话框类是从基类CDialog派生而来的。单击OK按钮,一个基于对话框资源模板的对话框类CFirstDlg就创建好了。此时,出现MFCClassWizard(MFC类向导)对话框。,图4.12“AddingaClass”对话框,图4.13“NewClass”对话框,4.1.6添加对话框代码,在MFCClassWizard对话框,查看“Classname”列表中是否选择了CFirstDlg,若不是,则在IDs列表中选择CFirstDlg。在Messages框中找到并选定WM_INITDIALOG消息,如图4.14。,图4.14“MFCClassWizard”对话框,4.1.6添加对话框代码,在Memberfunctions列表框中选择刚添加的OnInitDialog函数,单击EditCode按钮(或直接在函数名双击鼠标),将自动出现该函数代码编辑窗口,在此函数中添加下列代码:BOOLCFirstDlg:OnInitDialog()CDialog:OnInitDialog();/TODO:AddextrainitializationhereCStatic*pWnd=(CStatic*)GetDlgItem(IDC_STATIC_1);pWnd-SetWindowText(这是我的第一个对话框!);returnTRUE;/returnTRUEunlessyousetthefocustoacontrol/EXCEPTION:OCXPropertyPagesshouldreturnFALSE代码中,CStatic是静态文本控件的MFC类,SetWindowText是CWnd的一个成员函数,用来设置窗口的文本内容,由于控件类是CWnd的子类(派生类),因此可以使用基类的SetWindowText来改变静态文本控件显示的内容。GetDlgItem也是CWnd类的一个成员函数,用来获得对话框中控件(参数是控件的ID标识符,这里是IDC_STATIC_1)的窗口指针。,4.1.7在程序中调用对话框,在项目工作区窗口中选择ResourceView页面,双击资源“Menu”项中的IDR_MAINFRAME,则菜单编辑器窗口出现在主界面的右边,相应的Ex_SDI项目的菜单资源被显示出来,在菜单的最右一项,VisualC+为用户留出了一个空位置,用来输入新的菜单项,如图4.15所示。,菜单的空位置,图4.15Ex_SDI菜单资源,4.1.7在程序中调用对话框,(2)在菜单的空位置上双击鼠标左键,则出现它的属性对话框,在标题框中输入“测试(/定义对话框类对象dlg.DoModal();/显示对话框代码中,DoModal是CDialog基类成员函数,用来将对话框按模式方式来显示。(8)在OnTestDlg函数的实现文件MainFrm.cpp的前面添加CFirstDlg类的包含语句,即:#includeEx_SDI.h#includeMainFrm.h#includeFirstDlg.h,4.1.7在程序中调用对话框,(9)编译并运行。在应用程序菜单上,选择“测试”“对话框”菜单项,将出现如图4.20的对话框,这个对话框就是刚才添加的对话框。,图4.20对话框的显示,4.1.8使用无模式对话框,对话框有两种类型,一种是模式对话框,另一是无模式对话框。1.模式对话框所谓“模式对话框”是指当对话框被弹出,用户必须在对话框中作出相应的操作,在退出对话框之前,对话框所在应用程序的其它操作不能继续执行。一般情况下,模式对话框会有OK(确定)和Cancel(取消)按钮。单出OK按钮,系统认定用户在对话框中的选择或输入有效,对话框退出;单击Cancel按钮,对话框中的选择或输入无效,对话框退出,程序恢复原有状态。模式对话框的应用范围较广,上面示例中的对话框和平常所见到的大多数对话框都是模式对话框。2.无模式对话框所谓“无模式对话框”是指当对话框被弹出后,一直保留在屏幕上,用户可继续在对话框所在的应用程序中进行其它操作;当需要使用对话框时,只需象激活一般窗口一样单击对话框所在的区域即可激活。,4.1.8使用无模式对话框,下面在单文档应用程序Ex_SDI中创建并使用无模式对话框,其步骤如下:(1)在该项目中添加一个对话框资源,将其标识符设为IDD_DIALOG_SECOND,标题设为“无模式对话框”,对话框字体和大小设为“宋体,9号”。(2)为IDD_DIALOG_SECOND对话框资源创建一个对话框类CSecondDlg。(3)按Ctrl+W快捷键打开MFCClassWizard,从“Classname”列表中选择CSecondDlg,在IDs列表中选择IDOK,它是对话框中OK按钮的标识符,然后在Messages框中选择BN_CLICKED(单击按钮)消息,单击AddFunction按钮或双击BN_CLICKED消息,出现“AddMemberFunction”对话框以输入成员函数的名称,保留系统默认的函数名为OnOK,如图4.21所示。该函数是对OK按钮单击消息的映射,即当用户单击此对话框中的OK按钮时,OnOK函数被执行。(4)修改CSecondDlg:OnOK函数中的代码。voidCSecondDlg:OnOK()DestroyWindow();/终止对话框显示deletethis;/删除对话框,释放内存空间代码中,DestroyWindow是对话框基类CWnd的一个成员函数,用来终止窗口。,图4.21映射IDOK消息,4.1.8使用无模式对话框,(5)用MFCClassWizard来添加Cancel按钮(标识符为IDCANCEL)的BN_CLICKED消息映射,并修改其映射函数CSecondDlg:OnCancel的代码。voidCSecondDlg:OnCancel()DestroyWindow();deletethis;(6)将项目工作区切换到ClassView(类视图)页面,展开CMainFrame类的所有成员,双击OnTestDlg就会在文档窗口中自动定位到该函数的实现代码处,将其修改成下列代码:voidCMainFrame:OnTestDlg()CSecondDlg*pDlg=newCSecondDlg;/使用new来为对话框分配内存空间pDlg-Create(IDD_DIALOG_SECOND);/创建对话框pDlg-ShowWindow(SW_NORMAL);/显示对话框代码中,Create函数可以用来以一个对话框资源来创建对话框,ShowWindow是CWnd一个成员函数,用来显示对话框,SW_NORMAL用来指定将窗口显示成一般常用的状态。,4.1.8使用无模式对话框,(7)在文件MainFrm.cpp的前面添加CSecondDlg类的包含语句,即:#includeFirstDlg.h#includeSecondDlg.h(8)编译并运行。在应用程序菜单上,多次选择“测试”“对话框”菜单项,将会在同一个位置中出现多个对话框,拖动这些对话框到适当位置,如图4.22所示。,图4.22无模式对话框显示的结,4.2控件的创建和使用方法,控件是在系统内部定义的能够完成特定功能的控制程序单元。在应用程序中使用控件不仅简化了编程,还能完成常用的各种功能。为了更好地发挥控件作用,用户还必须理解和掌握控件的属性、消息以及创建和使用的方法。4.2.1控件的创建方法控件的创建方式有以下两种:一种是在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指定为对话框,这样做的好处是明显的,因为当应用程序启动该对话框时,Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清除。另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的Create函数来创建。,4.2.1控件的创建方法,例Ex_DlgCtrls使用控件的编程方式来创建一个按钮(1)选择“文件”“新建”菜单,在弹出的新建对话框的项目类型列表中选择MFCAppWizard(exe)类型,在工程框中输入项目名Ex_DlgCtrls,结果如图4.23所示。,图4.23MFCAppWizard的“新建”对话框,4.2.1控件的创建方法,(2)单击确定按钮,在出现的“Step1”对话框中选择“基本对话”应用程序类型,单击完成按钮,创建一个默认的基于对话框的应用程序项目。(3)将项目工作区切换到ClassView页面,展开CEx_DlgCtrlsDlg类,右击CEx_DlgCtrlsDlg类名,弹出如图4.24所示的快捷菜单。,图4.24弹出的快捷菜单,4.2.1控件的创建方法,4)从快捷菜单中选择AddMemberVariable(添加成员变量),在出现的对话框中定义一个CButton类对象m_btnWnd,通常以“m_”来作为变量的开头,表示“成员”(member)的意思。如图4.25所示,单击OK按钮。,图4.25添加成员变量,4.2.1控件的创建方法,(5)在项目工作区窗口的ClassView页面中,双击OnInitDialog函数名,在该函数中添加下列代码:BOOLCEx_DlgCtrlsDlg:OnInitDialog()CDialog: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);/设置控件字体returnTRUE;/returnTRUEunlessyousetthefocustoacontrol由于OnInitDialog函数在对话框初始化时被调用,因此将对话框中的一些初始化代码都添加在此函数中。代码中,Create用来创建一个按钮控件,该函数第一个参数用来指定该按钮的标题,第二个参数用来指定控件的风格,第三个参数用来指定它在父窗口中的位置和大小,第四个参数用来指定父窗口指针,最后一个参数是指定该控件的标识值。,4.2.1控件的创建方法,(6)编译并运行,结果如图4.26所示。,图4.26控件创建的结果,4.2.2控件的消息及消息映射,当控件的状态发生改变时,控件就会向其父窗口发送消息,这个消息称为“通知消息”。对于每个消息,系统都会用一个MSG结构来记录,MSG具有下列结构:typedefstructtagMSG/msgHWNDhwnd;/接收到消息的窗口句柄UINTmessage;/消息WPARAMwParam;/消息的附加信息,它的含义取决于messageLPARAMlParam;/消息的附加信息,它的含义取决于messageDWORDtime;/消息传送时的时间POINTpt;/消息传送时,光标所在的屏幕坐标MSG;对于一般控件来说,其通知消息通常是一条WM_COMMAND消息,这条消息的wParam参数的低位字中含有控件标识符,wParam参数的高位字则为通知代码,lParam参数则是指向控件的句柄。而对于有些控件,其通知消息通常是一条WM_NOTIFY消息,这条消息的wParam参数是发送通知消息的控件的标识符,而lParam参数则是指向一个结构指针。,4.2.2控件的消息及消息映射,1.映射控件消息在MFC中,映射一个控件消息是非常简便的。例如下面的步骤是用来映射按钮命令消息。打开Ex_DlgCtrls应用程序项目。将项目工作区窗口切换到ResourseView页面,双击Dialog资源下的标识IDD_EX_DLGCTRLS_DIALOG,打开该对话框资源模板。删除“TODO:在这里设置对话控制。”控件,添加一个按钮控件,保留其默认属性。如图4.27所示。,图4.27添加一个按钮,4.2.2控件的消息及消息映射,(4)按快捷键Ctrl+W,打开MFCClassWizard对话框,查看“Classname”列表中是否选择了CEx_DlgCtrlsDlg,在IDs列表中选择IDC_BUTTON1,这是添加按钮后,系统自动为此按钮设置的默认标识符,然后在Messages框中选择BN_CLICKED消息。(5)单击AddFunction按钮或双击BN_CLICKED消息,出现“AddMemberFunction”对话框,在这里可以输入成员函数的名称,系统默认的函数名为OnButton1。如图4.28所示。,图4.28添加按钮消息映射函数,4.2.2控件的消息及消息映射,(6)单击OK按钮,在MFCClassWizard的“Memberfunctions”列表中将列出新增加的成员函数。选择此函数,单击EditCode按钮(或直接在函数名双击鼠标),开发环境的文档窗口中将自动打开该函数所在的源代码文件,并定位到该函数的实现代码处。在此成员函数中添加下列代码:voidCEx_DlgCtrlsDlg:OnButton1()MessageBox(你按下了Button1按钮!);(7)编译并运行,当单击Button1按钮时,就会执行OnButton1函数,弹出一个消息对话框。这就是按钮BN_CLICKED消息的映射过程,其他控件的消息也可以类似操作。,4.2.2控件的消息及消息映射,2.映射控件通用消息上述过程是映射一个控件的某一个消息,事实上也可通过WM_COMMAND消息的映射来处理一个或多个控件的通用消息,如下面的步骤:打开MFCClassWizard对话框,在“Classname”列表中是否选择了CEx_DlgCtrlsDlg,在IDs列表中选择CEx_DlgCtrlsDlg,在Messages框中找到并双击OnCommand,这样OnCommand消息函数就添加好了,如图4.29所示。,图4.29添加OnCommand函数重载,4.2.2控件的消息及消息映射,(2)在OnCommand函数中添加下列代码:BOOLCEx_DlgCtrlsDlg:OnCommand(WPARAMwParam,LPARAMlParam)WORDnCode=HIWORD(wParam);/控件的通知消息WORDnID=LOWORD(wParam);/控件的ID值if(nID=201)注意:第一条if语句中,201是前面用Create创建按钮时指定的标识值。(3)编译并运行。当单击如前图4.27所示的Button1按钮时,就会弹出一个消息对话框。,4.2.3控件的数据交换(DDX)和数据校验(DDV),使用MFCClassWizard可以很容易地为一个控件定义关联变量并可设置其数据范围。例如,下面的步骤是为CEx_DlgCtrlsDlg类的按钮控件IDC_BUTTON1添加并使用其关联变量m_RelBtn。(1)打开MFCClassWizard,并切换到MemberVariables页面,如图4.30所示。,图4.30“MemberVariables”页面,4.2.3控件的数据交换(DDX)和数据校验(DDV),(2)选定Classname为CEx_DlgCtrlsDlg,然后在ControlIDs列表中,选定所要关联的控件ID标识符IDC_BUTTON1,双击鼠标左键或单击AddVariable按钮,弹出AddMemberVariable对话框,在对话框设置变量的名称、类别和数据类型,如图4.31所示。,图4.31“AddMemberVariable”对话框,4.2.3控件的数据交换(DDX)和数据校验(DDV),(3)在Membervariablename框中填好与控件相关联的成员变量m_RelBtn,单击OK按钮,又回到MFCClassWizard对话框的MemberVariables页面中,在ControlIDs列表中出现刚才添加的控件关联变量(或直接称之为“控件变量”)。(4)单击确定按钮后,打开CEx_DlgCtrlsDlg类源文件,可以发现MFCClassWizard对上述操作作了以下三方面的修改。在Ex_DlgCtrlsDlg.h文件中,添加控件关联变量的声明,代码如下面的加粗部分:/DialogData/AFX_DATA(CEx_DlgCtrlsDlg)enumIDD=IDD_EX_DLGCTRLS_DIALOG;/枚举类型CButtonm_RelBtn;CStringm_strEdit;/AFX_DATA,4.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();/AFX_DATA_INIT,4.2.3控件的数据交换(DDX)和数据校验(DDV),在Ex_DlgCtrlsDlg.cpp文件中的DoDataExchange函数体内,添加了控件的DDX/DDV代码,它们都是一些以DDV_或DDX_开头的函数调用。voidCEx_DlgCtrlsDlg:DoDataExchange(CDataExchange*pDX)CDialog:DoDataExchange(pDX);/调用此函数作为DDX的开始/AFX_DATA_MAP(CEx_DlgCtrlsDlg)DDX_Control(pDX,IDC_BUTTON1,m_RelBtn);DDX_Text(pDX,IDC_EDIT1,m_strEdit);/将IDC_EDIT1与m_strEdit进行数据交换DDV_MaxChars(pDX,m_strEdit,20);/校验m_strEdit的最大字符个数不超过20/AFX_DATA_MAP,4.2.3控件的数据交换(DDX)和数据校验(DDV),(5)当为一个控件定义一个关联的数据变量后,就可以使用CWnd:UpdateData函数实现控件数据的输入和读取。例如,将CEx_DlgCtrlsDlg:OnButton1修改成下列代码:voidCEx_DlgCtrlsDlg:OnButton1()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变量中,从而执行下一条语句后按钮的名称就变成了编辑框控件中的内容“Hello”,其结果如图4.33所示,图4.33使用控件的数据成员变量,4.3常用控件,根据控件的特性和功能,一般可将其分为三类:Windows公共控件、ActiveX控件以及MFC新增的一些控件等。表4.5列出了本书所用到的常用控件类。,表4.5常用控件类,4.3.1静态控件和按钮,1.静态控件一个静态控件是用来显示一个字符串、框、矩形、图标、位图或增强的图元文件。它可以被用来作为标签、框或用来分隔其它的控件。一个静态控件一般不接收用户输入,也不产生通知消息。在对话框编辑器的控件工具栏中,属于静态控件的有:静态文本()、组框()和静态图片()三种。其中,静态图片控件的一般属性对话框如图4.34所示。表4.6列出了其一般属性的各个项的含义。在属性对话框中,用户可以选择图片“类型”、“图像”两个组合框中的有关选项内容,并可将应用程序资源中的图标、位图等内容显示在该静态图片控件中。另外,用户还可设置其风格来改变控件的外观以及图像在控件的位置等。,1.静态控件,图4.34静态图片控件的General属性对话框,表4.6静态图片控件的General和Style属性,4.3.1静态控件和按钮,2.按钮在Windows中所用的按钮是用来实现一种开与关的输入,常见的按钮有3种类型:按键按钮、单选按钮、复选框按钮,如图4.37所示。,图4.37按钮的不同类型,4.3.1静态控件和按钮,2.按钮(1)按键按钮。按键按钮通常可以立即产生某个动作,执行某个命令,因此也常被称为命令按钮。按键按钮有两种风格:标准按键按钮和默认按键按钮。(2)单选按钮。单选按钮的外形是在文本前有一个圆圈,当它被选中时,单选按钮中就标上一个黑点,它可分为一般和自动两种类型。在自动类型中,用户若选中同组按钮中的某个单选按钮,则其余的单选按钮的选中状态就会清除,保证了多个选项始终只有一个被选中。(3)复选框。复选框的外形是在文本前有一个空心方框,当它被选中时,复选框中就加上一个“”标记,通常复选框只有选中和未选中两种状态,若复选框前面有一个灰色是“”,则这样的复选框是三态复选框,如图4.37的Check2,它表示复选框的选择状态是“不确定”。设定成三态复选框的方法是在复选框属性对话框的Style页面中选中“(状态)Tri-state”项。,4.3.1静态控件和按钮,3.按钮的消息在按钮映射的消息中,常见的只有两个:BN_CLICKED(单击按钮)和BN_DOUBLE-CLICKED(双击按钮)。4.按钮选中操作最常用的按钮操作是设置或获取一个按钮或多个按钮的选中状态。CButton类的成员函数SetCheck和GetCheck分别用来设置或获取指定按钮的选中状态,其原型如下:voidSetCheck(intnCheck);intGetCheck()const;其中,nCheck和GetCheck函数返回的值可以是:0表示不选中,1表示选中,2表示不确定(仅用于三态按钮)。而对于同组多个单选按钮的选中状态的设置或获取,需要使用通用窗口类CWnd的成员函数CheckRadioButton和GetCheckedRadioButton,它们的原型如下:voidCheckRadioButton(intnIDFirstButton,intnIDLastButton,intnIDCheckButton);intGetCheckedRadioButton(intnIDFirstButton,intnIDLastButton);其中,nIDFirstButton和nIDLastButton分别指定同组单选按钮的第一个和最后一个按钮ID值,nIDCheckButton用来指定要设置选中状态的按钮ID值,函数GetCheckedRadioButton返回被选中的按钮ID值。,4.3.1静态控件和按钮,5.示例:制作问卷调查问卷调查是日常生活中经常遇到的调查方式。例如,图4.38就是一个问卷调查对话框,它针对“上网”话题提出了三个问题,每个问题都有四个选项,除最后一个问题外,其余都是单项选择。,图4.38上网问卷调查对话框,4.3.1静态控件和按钮,例Ex_Research制作问卷调查1)创建并设计对话框(1)创建一个默认的对话框应用程序Ex_Research。(2)VisualC+会自动打开对话框编辑器并显示对话框资源模板。单击对话框编辑器工具栏上的切换网格按钮,显示对话框网格,将对话框标题改为“上网问卷调查”。(3)调整对话框的大小,删除对话框中间的“TODO:在这里设置对话控制。”静态文本控件,将确定和取消按钮移至对话框的下方,并向对话框中添加组框(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、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_Research,1)创建并设计对话框(6)接下来添加一个静态文本,标题设为“你使用的接入方式:”,然后在其下再添加4个单选按钮,标题分别是“FTTL或ADSL”、“单位LAN”、“拨号56K”和“其他”,并将相应的ID属性依次改成:IDC_CM_FTTL、IDC_CM_LAN、IDC_CM_56K和IDC_CM_OTHER。用对话框编辑器工具栏的按钮命令调整控件左右之间的间距,结果如图4.40所示。,图4.40再添加单选框图,4.3.1例Ex_Research,1)创建并设计对话框(7)在对话框的下方,再添加一个组框控件,其标题为“你上网主要是”。然后添加四个复选框,其标题分别为“收发邮件”、“浏览资料”、“聊天游戏”和“其他”,ID分别为IDC_DO_POP、IDC_DO_READ、IDC_DO_GAME和IDC_DO_OTHER。结果如图4.41所示。,图4.41三个问题全部添加后的对话框,4.3.1例Ex_Research,1)创建并设计对话框(8)单击工具栏上的测试对话框按钮。对话框测试后,可以发现:顺序添加的这8个单选按钮全部变成一组,也就是说,在这组中只有一个单选按钮被选中,这不符合我们的本意。解决这个问题的最好的办法是将每一组中的第一个单选按钮的Group(组)属性选中。(9)分别将这二个问题中的第一个单选按钮的Group(组)属性均选中。如图4.42所示是对第二个问题设置的结果。,图4.42选中“Group”属性,4.3.1例Ex_Research,1)创建并设计对话框(10)单击对话框编辑器工具栏上的切换辅助线按钮,然后将对话框中的控件调整到辅助线以内,并适当对其他控件进行调整。这样,整个问卷调查的对话框就设计好了,单击工具栏上的测试对话框按钮进行测试。,4.3.1例Ex_Research,(2)完善代码(1)将项目工作区切换到ClassView(类视图)页面,展开CEx_ResearchDlg类的所有成员,双击OnInitDialog函数名就会在文档窗口中自动定位到该函数的实现代码处,在此函数添加下列初始化代码:BOOLCEx_ResearchDlg:OnInitDialog()CDialog:OnInitDialog();CheckRadioButton(IDC_AGE_L18,IDC_AGE_M38,IDC_AGE_18T27);CheckRadioButton(IDC_CM_FTTL,IDC_CM_OTHER,IDC_CM_FTTL);CButton*pBtn=(CButton*)GetDlgItem(IDC_DO_POP);pBtn-SetCheck(1);/使“收发邮件”复选框选中returnTRUE;/returnTRUEunlessyousetthefocustoacontrol代码中,GetDlgItem是CWnd类的一个成员函数,用来获得对话框中控件(参数是控件的ID标识符)的窗口指针。,4.3.1例Ex_Research,(2)完善代码(2)用MFCClassWizard在CEx_ResearchDlg类中添加IDOK按钮的BN_CLICKED消息映射,并添加下列代码,使得用按确定按钮获取用户所作的选择内容。voidCEx_ResearchDlg:OnOK()CStringstr,strCtrl;/定义两个字符串变量,CString是操作字符串的MFC类/获取第一个问题的用户选择str=你的年龄:;UINTnID=GetCheckedRadioButton(IDC_AGE_L18,IDC_AGE_M38);GetDlgItemText(nID,strCtrl);/获取指定控件的标题文本str=str+strCtrl;/获取第二个问题的用户选择str=str+n你使用的接入方式:;nID=GetCheckedRadioButton(IDC_CM_FTTL,IDC_CM_OTHER);GetDlgItemText(nID,strCtrl);/获取指定控件的标题文本str=str+strCtrl;/获取第三个问题的用户选择str=str+n你上网主要是:n;UINTnCheckIDs4=IDC_DO_POP,IDC_DO_READ,IDC_DO_GAME,IDC_DO_OTHER;CButton*pBtn;,for(inti=0;iGetCheck()pBtn-GetWindowText(strCtrl);str=str+strCtrl;str=str+;MessageBox(str);CDialog:OnOK();代码中,GetDlgItemText是CWnd类成员函数,用来获得对话框(或其他窗口)中的指定控件的窗口文本。在单选按钮和复选框中,控件的窗口文本就是它们的标题属性内容。该函数有两个参数,第一个参数用来指定控件的标识,第二个参数是返回的窗口文本。后面的函数GetWindowText的作用与GetDlgItemText相同,也是获取窗口的文本内容。不过,GetWindowText使用更加广泛,但要注意这两个函数在使用上的不同。,4.3.1例Ex_Research,(2)完善代码(3)编译并运行,出现“上网问卷调查”对话框,当回答问题后,按确定按钮,出现如图4.43所示的消息对话框,显示用户选择的内容。,图4.43显示用户选择的内容,4.3.2编辑框和旋转按钮控件,1.编辑框编辑框是一个让用户从键盘输入和编辑文本的矩形窗口,用户可以通过它,很方便地输入各种文本、数字或者口令,也可使用它来编辑和修改简单的文本内容。当编辑框被激活且具有输入焦点时,就会出现一个闪动的插入符(又可称为文本光标),表明当前插入点的位置。(1)编辑框的属性和通知消息。用对话框编辑器可以方便地设置编辑框的属性和风格,如图4.44所示。表4.7还列出其中各项的含义。当编辑框的文本修改或者被滚动时,会向其父窗口发送一些消息,如表4.8所示。,图4.44编辑框的属性对话框,表4.7编辑框的Style属性,表4.8编辑框的通知消息,4.3.2编辑框和旋转按钮控件,1.编辑框(2)编辑框的基本操作。由于编辑框的形式多样,用途各异,因此下面针对编辑框的不同用途,分别介绍一些常用操作,以实现一些基本功能。口令设置。口令设置在编辑框中不同于一般的文本编辑框,用户输入的每个字符都被一个特殊的字符代替显示,这个特殊的字符称为口令字符。默认的口令字符是“*”,应用程序可以用成员函数CEdit:SetPasswordChar来定义自己的口令字符,其函数原型如下:voidSetPasswordChar(TCHARch);其中,参数ch表示设定的口令字符;当ch=0时,编辑框内将显示实际字符。选择文本。当在编辑框中编辑文本时,往往需要选定文本作为整体进行各种编辑操作。用户可以用鼠标或键盘来选择文本。用鼠标来选择文本的操作方法是:在要选择的文本的一端按下鼠标左键并拖动鼠标,到另一端释放鼠标键。用键盘来选择文本的方法是:在按光标方向移动键的同时,按住Shift键。设置编辑框的页面边距。设置编辑框的页面边距可以使文本在编辑框显示更具满意效果,这在多行编辑框中尤为重要,应用程序可通过调用成员函数CEdit:SetMargins来实现,这个函数的原型如下:voidSetMargins(UINTnLeft,UINTnRight);其中,参数nLeft和nRight分别用来指定左、右边距的像素大小。,4.3.2编辑框和旋转按钮控件,剪帖板操作。编辑框通过CEdit类的Copy、Paste和Cut成员函数来实现文本的复制、粘贴、剪切的操作,并还自动支持键盘快捷操作,其对应的快捷健分别为Ctrl+C、Ctrl+V和Ctrl+X。若应用程序调用CEdit:Undo函数时,则还可撤消当前的操作,再调用一次该函数,则恢复刚才的操作。例如下面的代码:if(m_Edit.CanUndo()m_Edit.Undo();获取多行编辑框文本。获取多行编辑框控件的文本可以有两种方法:一种是使用DDX/DDV,当将编辑框控件所关联的变量类型选定为CString(字符串类)后,则不管多行编辑框的文本有多少都可用此变量来保存,从而能简单地解决多行文本的读取。但这种方法不能单独获得多行编辑框中的某一行文本。另一种方法是使用编辑框CEdit类的相关成员函数来获取文本。例如,下面的代码将显示编辑框中第二行的文本内容:charstr100;if(m_Edit.GetLineCount()=2)/判断多行编辑框的文本是否有两行以上intnChars;nChars=m_Edit.LineLength(m_Edit.LineIndex(1);/获取第二行文本的字符个数/0表示第一行,1表示第二行,依次类推。LineIndex用于将文本行转换成/能被LineLength识别的索引m_Edit.GetLine(1,str,nChars);/获取第二行文本strnChars=0;MessageBox(str);代码中,由于调用GetLine获得某
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 混凝土浇筑施工方案
- 城市更新视角下2025年TOD开发模式创新实践研究
- 老年人健脾饮食表
- 屋面拆除工程施工方案
- 2025医疗机构清洁服务合同范本
- 2025年有关委托销售的商业合同范本
- 2 法律保障生活(共28张)+公开课一等奖创新教学设计+视频素材
- 2025企业高级职位聘任合同书新版(合同版本)
- 离婚诉讼中的弱者保护:居住权设立
- 城市垃圾转运站建筑结构优化设计与安全评估报告
- 神经内科进修汇报
- 两段炉讲座课件
- 火灾调查第四章-火灾痕迹物证课件
- 大型医院耗材管理SPD系统
- 精选提高脑卒中偏瘫患者良肢位摆放的正确率品管圈讲义
- 大金龙纯电动车hvcm及bms外网协议
- GB/T 19960.1-2005风力发电机组第1部分:通用技术条件
- 生产作业管理讲义
- 二年级上册《树之歌》优秀课件
- 锅炉安全技术规程
- 初中音乐《快乐的女战士》《水草舞》课件
评论
0/150
提交评论