版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.1对话框的使用VisualC++6.0提供的对话框编辑器能“可视”地进行设计、编辑对话框,并可用ClassWizard为对话框从CDialog基类中派生一个类;MFC的CDialog类封装了用于对话框的显示、关闭等操作的许多功能函数,例如:DoModal函数用来显示模式对话框并返回用户操作的结果。在VisualC++6.0应用程序中,使用一个对话框的一般过程是:(1)添加对话框资源;(2)设置对话框的属性;(3)添加和布局控件;(4)创建对话框类;(5)添加对话框代码;(6)在程序中调用对话框。下一页返回3.1对话框的使用[例3.1]创建一个模式对话框所谓模式对话框是指当对话被弹出时,用户必须在对话框中进行相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。平常所见到的对话框大多是模式对话框。建立模式对话框的步骤有以下几步。(1)创建一个SDI(单文档)应用程序,名为:模式对话框。(2)创建对话框模板的过程是:在顶层菜单中选择Insert→Resource命令,选中Dialog,单击New按钮;在页面右边就显示出了对话框模板。再在控件工具栏上用鼠标单击静态文本(Aa)控件不放,移动到对话框上的合适位置,放开左键,静态文本(Aa)控件就添加到对话框上了。右击这个静态文本控件,便弹出快捷菜单,选择properties(属性)命令,弹出属性对话框,在Caption(标题)框中写:“新建模式对话框”,关闭属性对话框,“新建模式对话框”字样就显示在这个静态文本控件上。上一页下一页返回3.1对话框的使用(3)修改对话框ID:右击对话框的任何位置,弹出快捷菜单,选择properties(属性)命令,弹出Dialogproperties(属性)对话框,将对话框的ID设置为IDD_MYDIALOG,Caption(标题)框中写:模式对话框。(4)给对话框创建类:双击对话框的任何位置,弹出AddingaClass对话框,选中Createanewclass单选按钮,单击OK按钮,弹出NewClass对话框,在Name文本框中输入类名:CMyDlg,单击OK按钮,这样就建成了对话框类:CMyDlg。(5)创建一个顶层菜单,ID为ID_PUPDIALOG,标题为:模式对话框(&A)的菜单命令。(6)将菜单(ID_PUPDIALOG)命令映射到主框架类CMainFrame中,并添加代码:上一页下一页返回3.1对话框的使用voidCMainFrame::OnPupdialog(){CMyDlgMyDlg;//CMyDlg是CDialog的派生类,这里是定义对话框类对象MyDlg.DoModal();//DoModal()是CDialog类成员函数,调用该函数来显示对话框}(7)在CMainFrame.cpp文件的前面加文件,包含:
#include"MyDlg.h"(8)编译运行,如图3.1所示。只能在对话框中进行相应的操作,不能进行其他操作。上一页下一页返回3.1对话框的使用[例3.2]创建一个无模式对话框无模式对话框在弹出后,可一直保留在屏幕上,用户可继续在应用中进行其他操作或启动其他应用程序,当需要使用对话框时,只需像激活一般窗口一样激活对话框即可。(1)创建一个SDI(单文档)应用程序,名为:无模式对话框。(2)按上例步骤创建对话框模板,拖出一个静态文本,其属性对话框上的ID不动,在标题框写:新建无模式对话框。(3)为对话框创建类,类名为:CDlg。上一页下一页返回3.1对话框的使用(4)创建菜单,菜单名字为:无模式对话框(&W),ID为ID_DLG。(5)将菜单消息(ID_DLG)映射到视图类(CMyView)中。(6)在视图类头文件CMyView.h的前面加文件包含:#include“Dlg.h”。在public:下加:CDlg*dlg;//定义对话框类指针对象在视图类执行文件CMyView.cpp的菜单命令函数中添加下列代码:上一页下一页返回3.1对话框的使用CMyView::OnDlg(){dlg=newCDlg(this);//对话框类的首地址dlg->Create(IDD_DIALOG1);//从资源中创建一个非模式对话框,Create是基类Cdialog成 //员函数//下面参数SW_RESTORE
是用原来的大小和位置显示一个窗口,同时令其进入活动状态dlg->ShowWindow(SW_RESTORE);//显示窗口}上一页下一页返回3.1对话框的使用(7)编译运行,结果如图3.2所示。对话框弹出后,一直保留在屏幕上,用户可继续在应用程序中进行其他操作。在应用程序菜单上多次选择“无模式对话框”命令,将会在文档窗口弹出多个对话框;还可以拖动这些对话框。说明:程序中ShowWindow(SW_RESTORE))是显示窗口函数,其参数宏和其他参数宏的意义如下:
SW_RESTORE
用原来的大小和位置显示一个窗口,同时令其进入活动状态;
SW_HIDE
隐藏窗口,活动状态给另一个窗口,(激活另外一个窗口,当前窗口就跑到那个窗口后面了);上一页下一页返回3.1对话框的使用SW_MINIMIZE
最小化窗口,活动状态给另一个窗口;SW_SHOW
用当前的大小和位置显示一个窗口,同时令其进入活动状态;SW_SHOWMAXIMIZED
最大化窗口,并将其激活;SW_SHOWMINIMIZED
最小化窗口,并将其激活;SW_SHOWMINNOACTIVE
最小化一个窗口,同时不改变活动窗口;SW_SHOWNA
用当前的大小和位置显示一个窗口,不改变活动窗口;SW_SHOWNOACTIVATE
用最近的大小和位置显示一个窗口,同时不改变活动窗口;SW_SHOWNORMAL
与SW_RESTORE相同。上一页下一页返回3.1对话框的使用
模式对话框和无模式对话框在用资源编辑器设计和使用MFCClassWizard创建用户对话框类的方法是一致的,但在对话框的创建和退出的方式是不同的。(1)在创建时,模式对话框由系统自动分配内存空间,因此,在退出对话框时,对话框对象会自动删除;而无模式对话框则需要用户来指定内存,退出时还需用户自己来删除对话框对象。(2)在退出时,两种对话框所使用的终止函数不一样。模式对话框通过调用CDialog::EndDialog来终止;而无模式对话框通过调用CWnd::DestroyWindow来终止。上一页返回3.2资源与资源标识
资源是Windows编程中不可缺少的重要组成部分。VisualC++6.0将Windows应用程序中经常用到的菜单、加速键、工具栏、对话框、图标、光标、字符串等都视为“资源”,并将其单独存放在一个资源文件中。每个资源都由相应的标识符来区分,并且可以像变量一样进行赋值。1.资源的分类创建一个单文档应用程序,名为:对话框,然后将项目工作区切换到ResourceView选项卡,展开所有的节点,如图3.3所示。可以看出,一个单文档应用程序所使用的资源可分为以下7类。下一页返回3.2资源与资源标识
(1)Accelerator(快捷键列表):快捷键列表为一系列组合键的集合,被应用程序用于引发一个动作。该列表一般与菜单命令相关联,用于代替鼠标操作。(2)Dialog(对话框):为含有按钮、列表框、编辑框等各种控件的窗口。(3)Icon(图标):图标是代表应用程序显示在Windows桌面上的位图,它同时有32像素×32像素和16像素×16像素两种规格。(4)Menu(菜单):用户通过菜单可以完成应用程序的大部分操作。上一页下一页返回3.2资源与资源标识
(5)StringTable(字串表):是应用程序使用的全局字符串或其他标识符。(6)Toolbar(工具栏按钮):是由一系列具有相同尺寸的位图组成的,它通常与一些菜单命令相对应,用于提高用户的工作效率。(7)Version(版本信息):版本信息包含应用程序的版本、用户注册码等相关信息。除了上述常用资源类别外,VisualC++6.0应用程序中还可有鼠标、HTML等,也可以自己添加新的资源类别。上一页下一页返回3.2资源与资源标识2.ID资源标识符从图3.3可以看到每一个资源类别都有一个或多个相关资源,每一个资源均是由标识符来定义的。当添加或创建一个新的资源或资源对象时,系统会为其提供默认的名称并赋值,如:IDR_MAINFRAME等,该定义保存在Resource.h文件中;当然,用户也可重新为标识符命名。在VisualC++6.0中,源程序引用资源和其他用户定义的对象是通过标识符来进行的。资源标识符的名称规则和其他标识符相同,但要注意,资源标识符不区分大小写字母,字符个数不得超过247个。一般情况下,不同的资源使用不同的资源标识符前缀。表3.1列出了资源标识符定义的常用前缀。上一页下一页返回3.2资源与资源标识
在VisuanC++中,资源标识符都有一个整数与之对应,取值范围为0~65535。系统为创建的标识符自动赋值,用户也可以修改这些值。在同一个程序项目中,资源标识符名称不能一样,不同的标识符的值也不能一样。如下代码所示,“模式对话框”程序的Resource.h文件中定义的6个资源标识符,其中标识符IDR_MAINFRAME的值是128。上一页下一页返回3.2资源与资源标识//Resource.h//Usedby模式对话框.rc#defineIDD_ABOUTBOX100#defineIDR_MAINFRAME128#defineIDR_MYTYPE129#defineIDD_MYDIALOG130//是新设置的模式对话框的ID值#defineID_MENUITEM3277132771#defineID_PUPDIALOG32773上一页下一页返回3.2资源与资源标识
选择顶层菜单的View→ResourceSymbols命令,弹出ResourceSymbols对话框,如第2章图2.6所示。其中列出了已被使用和未被使用的标识符名称及其对应的值,从中可以新建一个标识符:在资源标识符浏览器中单击New按钮,屏幕弹出NewSymbol对话框,输入标识符名称和数值即可,这样就可以在程序中处理这个标识符,如第2章例2.3,就是这个问题的实例。上一页返回3.3创建对话框及添加控件
在模式对话框和非模式对话框的两节中,已经知道了创建对话框和添加控件的方法,这里再做进一步的介绍。1.创建对话框创建一个单文档应用程序,名为:创建对话框。插入一个对话框,其步骤是:选择Insert→Resource命令,选中Dialog单击New按钮,便在此程序中创建了一个对话框(当然重复此步骤,可以创建多个对话框)。从中可以看出以下两点。(1)系统为这个对话框自动赋予一个默认的标识符,名为:IDD_DIALOG1,对话框的默认标题为Dialog,有OK和Cancel两个按钮,这两个按钮的ID标识符分别为IDOK和IDCANCEL。(2)对话框模板资源所在的窗口称为“对话框资源编辑器”,在这里可以通过“控件工具栏”和“布局工具栏”向对话框添加和布局控件,并可设置对话框的属性。下一页返回3.3创建对话框及添加控件2.添加和布局控件将控件工具栏(如图3.4所示)上的某几个控件拖到对话框上,这里拖入3个静态文本控件和1个按钮控件,如图3.6所示。用控件布局工具栏(如图3.5所示)可以对这些控件进行布局、排序、大小调整、上下、左右对齐、测试等。上一页下一页返回3.3创建对话框及添加控件说明:(1)添加控件的方法
1)左键单击控件栏中某控件不放,移动到对话框的某位置,放开鼠标,控件就出现在对话框中。
2)左键单击控件栏中某控件之后松开,移动鼠标到对话框上某位置(鼠标箭头变成“+”字形状)上单击,控件就出现在这个位置上。(2)控件的选取控件的删除、复制和布局操作一般都要先选取控件。
1)单击某个控件,则某个控件被选取。
2)先在对话框内按住鼠标左键不放,移动鼠标,拖出一个大的方虚框,然后释放鼠标,则被该虚框所包围的控件都将被选取。上一页下一页返回3.3创建对话框及添加控件3)先按下Shift键,然后用鼠标选取控件,直到所需要的多个控件被选取之后,再放开Shift键,则这些控件被选取。
4)控件被选取时,鼠标单击对话框,则取消控件的选取。若多个控件被选取,再选取其中一个,则其中一个保留选取,其他控件被取消选取。
5)一旦单个控件被选取后,其四周由选择框包围着,选择框上还有几个(一般是8个)蓝色实心小方块,拖动它可改变控件的大小;多个控件被选取后,其中只有一个控件的选择框有几个蓝色实心小方块,这个控件称为主要控件,如图3.6的Button1(按钮控件)。而其他控件选择框的小方块是空心的,如图3.6所示的Static(3个静态控件)。多个控件的上下、左右对齐、间隔相等及大小一致等,都以主控件为准。上一页下一页返回3.3创建对话框及添加控件(3)控件的移动、复制和删除
1)当单个控件或多个控件被选取后,按方向键或用鼠标拖动控件的选择框可移动控件。
2)若在鼠标拖动过程中还按住Ctrl键,则复制控件。
3)按Del键可将选取的控件删除。(4)测试对话框
Layout菜单下的Test命令或布局工具栏上的测试按钮,是用于模拟所编辑的对话框的运行情况,帮助用户检验对话框是否符合用户的设计要求以及空间功能是否有效等。上一页下一页返回3.3创建对话框及添加控件
与布局工具栏相对应的菜单命令在Layout(编排)菜单下,而且大部分命令均有相应的快捷键,如图3.7所示。表3.2还列出了Layout菜单命令的快捷键与功能描述。Layout菜单不是在VisualC++6.0开发环境一开始就出现的,而是随着对话框编辑器的打开而显示的。3.设置对话框的属性打开前面创建的“创建对话框”应用程序:①选择顶层菜单的View→Properties命令;②按Alt+Enter组合键;③右击对话框模板,在弹出的快捷菜单中选择Properties命令;这3种方式都能弹出对话框的属性框,如图3.8所示。上一页下一页返回3.3创建对话框及添加控件
属性框中有:General(一般属性)、Styles(风格)、MoreStyles(更多风格)、ExtendedStyles(扩展风格)、MoreExtendedStyles(更多扩展风格)等部分。下面介绍常用的General属性,如表3.3所示。将新加的对话框的属性(General)进行以下修改。(1)改对话框ID标识符为:IDD_MYDIALOG。(2)改对话框标题(Caption)为:我的对话框。(3)单击Font(字体)按钮,将字体改为“宋体,9”,以使自己的对话框和Windows中的对话框保持外观上的一致。上一页下一页返回3.3创建对话框及添加控件4.为对话框添加类对准对话框的任意非控件位置双击,将弹出如图3.9所示的对话框,询问是否为对话框资源创建一个新类,选中Crealteanewclass单选按钮,单击OK按钮,弹出如图3.10所示的对话框,写入一个新类的名字如:CMyDlg(注意:类名应以大写的“C”开头),下面的基类Baseclass和ID标识符内容一般不改。5.添加映射消息选择View→ClassWizard命令,弹出MFCClassWizard对话框,在Classname处选择CMyDlg,在ObjectIDs里选择IDC_BUTTON1,选中BN_CLICKED(单击该按钮)消息,依次单击AddFunction→OK→EditCode按钮。上一页下一页返回3.3创建对话框及添加控件6.添加代码在MyDlg.cpp文件的OnButton1()(按钮消息映射)函数中写:voidCMyDlg::OnButton1(){MessageBox("欢迎进入对话框的设计!");}这时运行还不见对话框被弹出,因为还需要进行下一步。7.在程序中调用对话框由于对话框的代码是以类为模块来设计的,使用时需要在程序中加入该类的头文件,并定义一个类对象,然后就可以使用该类的相关成员。上一页下一页返回3.3创建对话框及添加控件打开项目工作区的FileView选项卡,打开应用程序的执行文件“创建对话框.cpp”,在其前面加:#include“MyDlg.h”。在InitInstance函数体中的returnTRUE语句之前添加下列代码:BOOLCMyApp::InitInstance(){…………CMyDlgdlg;//定义对话框类对象//DoModal()函数是负责对话框的显示和终止dlg.DoModal();return}上一页下一页返回3.3创建对话框及添加控件8.编译运行对话框被弹出,单击Buttonl按钮控件,弹出一个小对话框,上面有“欢迎进入对话框的设计!”字样,如图3.11所示。注意:本例建的CMyDlg类及以后在各个项目中建立的类,在文档、视图、主框架类中都可同样使用。将上面添加的按钮(Button1)控件拉得长一些,以能显示出写入的全部信息。9.在按钮控件上直接显示信息用ClassWizard在CMyDlg类中,加WM_INITDIALOG映射消息,步骤是:上一页下一页返回3.3创建对话框及添加控件
选择View→ClassWizard命令,在Classname下拉列表框中选择CMyDlg,在Messages框选择WM_INITDIALOG,单击AddFunction按钮后再单击EditCode按钮,便在CMyDlg.cpp文件中建立了BOOLCMyDlg::OnInitDialog()函数,在此函数中添加代码:BOOLCMyDlg::OnInitDialog(){ CDialog::OnInitDialog();CStatic*pWnd=(CStatic*)GetDlgItem(IDC_BUTTON1);//得到IDC_BUTTON1控件句柄
pWnd->SetWindowText("直接在按钮上显示文字!");//将这些字符显示在Button1控件上}上一页下一页返回3.3创建对话框及添加控件10.编译运行如图3.12所示,在按钮控件(Button1)上看到“直接在按钮上显示文字”字样,而且再单击按钮控件,又弹出一个小对话框,上面写着“欢迎进入对话框的设计!”。如果像“模式对话框”和“非模式对话框”那样,用编辑器直接在控件的属性标题处写:“直接在按钮上显示文字”,就简单多了。而像这种用程序语句将文字写控件上,比上面做法要复杂得多,因此一般不用这种方法。上一页下一页返回3.3创建对话框及添加控件说明:(1)CStatic是MFC的静态文本控件类;(2)GetDlgItem是CWnd的成员函数,通过该函数可以得到对话框中某ID号对应的控件的句柄,参数是控件的ID标识符,这里的ID标识符是BUTTON1(该对话框上的按钮标识符);(3)SetWindowText:是CWnd的一个成员函数,用于设置窗口(控件)的文本内容,由于控件类是CWnd的子类(派生类),因此可以使用基类的SetWindowText来改变按钮控件的显示内容。上一页下一页返回3.3创建对话框及添加控件11.对话框资源类型打开前面的“创建对话框”应用程序,选择顶层菜单的Insert(插入)→Resource命令,或按Ctrl+R组合键,弹出InsertResource对话框,选中Dialog项,单击其左边的“+”号,展开对话框资源的不同类型,如图3.13所示,表3.4列出了各种类型对话框资源的不同用途。其中,New(新建)按钮用于创建一个由“资源类型”列表中指定类型的新资源,Import(导入)按钮是用于将外部已有的位图、图标、光标或其他定制的资源添加到当前应用程序中,Custom(定制)按钮用于创建“资源类型”列表中没有的新的类型资源。上一页返回3.4控件的创建和使用方法
控件是Windows图形用户界面的主要组成部分之一,用户通过操作控件对象完成与应用程序之间的交互。控件的使用集中体现了Windows系统面向对象的特点。在应用程序中调用控件不仅简化了编程,还能完成常见的各种功能。为了更好地发挥控件的作用,用户还必须理解和掌握控件的属性、消息以及创建和使用方法。控件的外观和功能各不相同,但它们都是以子窗口的形式存在的,在控件创建、消息处理和控制方面有许多相似之处。下一页返回3.4控件的创建和使用方法3.4.1控件的创建方法控件的创建方法有两种:(1)在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指定为对话框,如前面“创建对话框”应用程序的Button1按钮,是直接用鼠标拖过来的办法添加的;(2)将控件看作任意一窗口的子窗口,并通过调用相应的Create函数来创建。该方法是用程序语句来创建一个控件,比较复杂,且不能发挥对话框编辑器的可视化的优点,因此一般不用。但为了了解该创建方法,下面举一个例子。上一页下一页返回3.4控件的创建和使用方法[例3.3]通过调用Create函数来创建一个控件(1)创建一个单文档的应用程序,名为:创建控件。(2)插入(InsertResource)一个对话框,并为这个对话框建类,名为:CMyDlg。(3)在应用程序的执行文件(创建控件.cpp)头部加下列代码:#include"MyDlg.h"并在该文件InitInstance()函数的returnTRUE;语句前加下列代码:BOOLCMyApp::InitInstance()上一页下一页返回3.4控件的创建和使用方法{……CMyDlgdlg;dlg.DoModal();//DoModal()函数负责对话框的显示和终止
returnTRUE;}(4)在对话框CMyDlg类的头文件MyDlg.h的public下添加一个按钮类的指针变量:CButton*m_btnWnd;(5)为CMyDlg类加WM_INITDIALOG映射消息,并添加代码:上一页下一页返回3.4控件的创建和使用方法BOOLCMyDlg::OnInitDialog(){//控件是作为对话框的一个子窗口来创建的m_btnWnd=newCButton();//构造按钮控件的指针,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);//设置控件上的字体returnTRUE;}上一页下一页返回3.4控件的创建和使用方法
(7)编译并运行,结果如图3.14所示,对话框上出现一个按钮控件,上面写着“你好”,它就是用程序语句在对话框上加的按钮控件。说明:①由于OnInitDialog函数在对话框初始化时被调用,因此将对话框中的一些初始化代码都添加在此函数中;上一页下一页返回3.4控件的创建和使用方法②代码中Create函数用于创建一个控件,该函数的第1个参数用于指定该控件的标题,这里是“你好”,第2个参数用于指定该控件的风格,第3个参数用于指定该控件在父窗口的位置和大小,第4个参数用于指定父窗口的指针,这里是“this”,第5个参数是指定该控件的标识值,这里是“201”;③控件的风格有WS_CHILD、WS_VISIBLE和BS_PUSHBUTTON,都是VisualC++6.0系统内部定义的标识符,可以直接引用,由于按钮是作为对话框的一个子窗口来创建的,因此其风格必须有(见第四章表4.1)①WS_CHILD创建子窗口;②WS_VISIBLE使控件可见;③BS_PUSHBUTTON表示创建的是按键按钮。上一页下一页返回3.4控件的创建和使用方法3.4.2基于对话框的应用程序可以直接利用MFCAppWizard应用程序向导,创建一个基于对话框的应用程序,这种程序运行后首先出现一个对话框。(1)创建一个基于对话框的应用程序,名为:控件的创建。过程如下:打开VC系统选择File→New命令,选择MFCAppWizard(exe),在Location处写路径名,在Projectname处写文件名:控件的创建单击OK按钮,选中Dialogbased单选按钮,如图3.15所示,单击Finish按钮,再单击OK按钮。这就建立了一个基于对话框的程序。上一页下一页返回3.4控件的创建和使用方法
(2)将项目工作区切换到ClassView选项卡,展开CMyDlg类,右击CMyDlg,便弹出如图3.16所示的快捷菜单,从快捷菜单中选择AddMemberVariable(添加成员变量)命令,弹出Membervariablename对话框,在VariableType处写:CButton,在VariableName处写:m_btnWnd,单击OK按钮。通常以“m_”作为变量的开头,表示“成员”的意思,如图3.17所示。(3)还是在ClassView页面,展开CMyDlg类,双击OnInitDialog函数,在右侧便出现这个函数,在它的returnTRUE语句前面加如下代码:上一页下一页返回3.4控件的创建和使用方法BOOLCMyDlg::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;}(4)编译运行,结果如图3.14所示一样。上一页下一页返回3.4控件的创建和使用方法3.4.3控件的消息及消息映射应用程序可以向控件发送消息,控件也可以向应用程序发送消息,这样的消息被称为通知消息。当控件的状态发生改变(例如用户利用控件进行输入)时,子窗口控件通过向其父窗口(应用程序窗口)发送WM_COMMAND消息进行通信。消息WM_COMMAND的lParam参数中包含了控件句柄,wParam参数的低字节中含有控件标识符,wParam参数的高字节则为通知代码。各控件通知代码不一样,例如,按钮被单击产生的通知代码是BN_CLICKED,用户在编辑框中更改了输入数据会产生通知代码EN_CHANGE等。上一页下一页返回3.4控件的创建和使用方法
在3.3节的第5步,已为Button1按钮添加了映射控件消息,当单击Button1按钮时,系统会弹出一个小对话框。而在第9步则实现了直接将信息发送到Button1控件上。为了进一步掌握控件的消息及消息映射,再作以下讨论。[例3.4]映射控件消息(1)创建一个基于对话框的应用程序,名为:映射控件消息。(2)将项目工作区窗口切换到ResourseView选项卡,打开Dialog,双击IDD_MY_DIALOG。(3)删除对话框上面的一个原有控件“TODO……”,添加一个按钮控件Button1,保留其默认属性。上一页下一页返回3.4控件的创建和使用方法
(4)选择View→ClassWizard命令,在弹出对话框的Classname处选择CMyDlg,在IDs列表中选择IDC_BUTTON1(这是添加按钮后,系统自动为这个按钮设置的默认标识符),在Messages框中选择BN_CLICKED消息,单击AddFunction按钮或双击BN_CLICKED消息,弹出AddMemberFunction对话框,在这里可以输入成员函数的名称,取系统默认的函数名为:OnButton1,如图3.18所示。上一页下一页返回3.4控件的创建和使用方法说明:①不同资源对象(控件、菜单等命令)所产生的消息是不相同的。例如按钮控件IDC_BUTTON1的消息有两个——BN_CLICKED和BN_DOUBLECLICKED,分别表示当用户单击或双击该按钮时产生的消息;②一般不需要对对话框中的OK(确定)和Cancel(取消)进行消息映射,系统已自动设置了这两个按钮的动作,当用户单击这两个按钮都将自动关闭对话框,而OK按钮动作还使得对话框数据有效。(5)单击OK按钮,在MFCClassWizard的Memberfunctions列表中将列出新增加的成员函数,选择此函数,单击EditCode按钮(或直接在函数名上双击),开发环境的文档窗口中将自动打开该函数所在的源代码文件,并定位到该函数的实现代码处。在此成员函数中添加下列代码:上一页下一页返回3.4控件的创建和使用方法voidCMyDlg::OnButton1(){MessageBox("你按下了\"Button1\"按钮!");}
(6)编译运行,单击按钮控件,便弹出一个小对话框,上面写“你按下了‘Button1’按钮”,如图3.19所示。上一页下一页返回3.4控件的创建和使用方法[例3.5]映射控件通用消息上述过程是映射一个控件的某一个消息,事实上也可以通过WM_COMMAND消息映射来处理一个或多个控件的通用消息,具体步骤有以下几步。(1)打开前面“映射控件消息”程序。(2)在Classname列表中选择CMyDlg,在IDs列表框中也选择CMyDlg,在Messages列表框中选择OnCommand,单击AddFunction和EditCode按钮,这样在CMyDlg类中就建好了OnCommand消息函数,如图3.20所示。由于OnCommand函数是一个用于处理WM_COMMAND消息的虚函数,因此这里添加的OnCommand函数事实上是一个在类中实际调用的函数,可称为“实例函数”。这样的映射操作,可以称之为“对虚函数OnCommand的重载”。上一页下一页返回3.4控件的创建和使用方法(3)在OnCommand函数中添加下列代码:
BOOLCMyDlg::OnCommand(WPARAMwParam,LPARAMlParam){WORDnCode=HIWORD(wParam);//用于获取32位数值中的高位,通知代码
WORDnID=LOWORD(wParam);//用于获取32位数值中的低位,控件的ID标识值
if((nID==201)&&(nCode==BN_CLICKED))//判别控件的ID标识符值与通知代码
MessageBox("你按下了\"你好\"按钮!");if((nID==IDC_BUTTON1)&&(nCode==BN_CLICKED))MessageBox("这是在OnCommand处理的结果!");returnCDialog::OnCommand(wParam,lParam);}(4)编译并运行,结果如图3.21和图3.22所示。上一页下一页返回3.4控件的创建和使用方法
注意:代码中if语句中的201是前面用Create创建按钮时指定的标识值。说明:(1)WORD是16位无符号整数。
BN_CLICKED是当用户单击按钮产生的消息。
EN_CHANGE是编辑框中的文本被改变时发出的消息。
WPARAMwParam此参数所代表的是虚拟键码,此码可用于检测究竟是哪一个键被按下。
LPARAMlParam是由32位组合而成,除部分保留未使用外,可以将其他部分分成6个域予以说明,如图3.23所示。上一页下一页返回3.4控件的创建和使用方法1)重复次数:是指键盘被按下或是放开按键的次数。
2)OEM扫描码:是由键盘的硬件产生。
3)扩展键标志:如果按的是增强键,如Alt、Ctrl等标志值是1,一般Windows应用程序很少用此域。
4)内容码:主要用于检测是否按下Alt键。
5)转换状态:是指如果有按键(Down)发生,此域为0;如果是放开(Up)发生,则此域为1。上一页下一页返回3.4控件的创建和使用方法
还有:由于该项目中Button1按钮的BN_CLICKED消息处理同时存在两种函数,即OnButton1和OnCommand,当单击Button1按钮时,系统先执行OnCommand函数代码,然后执行OnButton1函数代码。因OnCommand函数的最后一句代码有“returnCDialog::OnCommand(wParam,lParam);”,它的作用是将控件的消息交由对话框其他函数处理。所以该例中,单击两次Button1按钮,就出现设置的BUTTON1的不同的两个信息。由于用Create创建的控件无法用MFCClassWizard直接映射其消息,因此上述方法弥补了ClassWizard的不足,使用时要特别注意。上一页下一页返回3.4控件的创建和使用方法(2)除一些常用的数据类型外,Windows还提供一些宏来表示一些基本数据类型,如:LOBYTE、HIBYTE分别用于获取16位数值中的低位和高位字节;LOWORD和HIWORD分别用于获取32位数值中的低位和高位字;MAKEWORD是将2个16位无符号值结合成一个32位无符号值。下面通知消息是所有Windows控件所共有的:NM_CLICK 在控件中单击按钮;NM_DBLCLK在控件中双击按钮;NM_RDBLCLK 在控件中双击鼠标右键按钮;NM_RETURN 当控件具有输入焦点时按下Enter键;NM_SETFOCUS 控件得到输入焦点;NM_KILLFOCUS 控件失去输入焦点;NM_OUTOFMEMORY 由于没有足够的可用内存,控件无法完成一次操作。上一页下一页返回3.4控件的创建和使用方法3.4.4控件的数据交换和数据效验为了能让用户直接方便地操作一个控件,MFC采用了独特的控件的数据交换(DDX)和数据效验(DDV)技术,DDX将数据成员变量与对话框模板内控件相连接,这样使得数据在控件之间很容易传输。DDV用于数据的校验,例如它能自动校验数据成员变量数值的范围,并发出警告。使用MFCClassWizard可以很容易地定义一个控件的成员变量及其数据范围。上一页下一页返回3.4控件的创建和使用方法[例3.6]控件的数据传输(1)打开上例“映射控件消息”程序:选择View→ClassWizard命令,在弹出的对话框中打开MemberVariables选项卡,在Classname列表框中选择CMyDlg,然后在ControlIDs列表中选择IDC_BUTTON1,单击AddVariable按钮(或双击),弹出AddMemberVariable对话框,在Membervariablename处写好成员变量名:m_MyBtn,Variabletype(变量类型)为:CButton,Category(种类)为:Control,如图3.24所示,单击OK按钮,如图3.25所示,就建好了成员变量。上一页下一页返回3.4控件的创建和使用方法
(2)再向对话框添加一个编辑控件,ID默认,加成员变量为:m_strEdit,类型为CString,在Maximumcharacters(最大字符串个数)框写:20,目的是在按钮BUTTON1和编辑EDIT1控件之间进行数据交换,交换的最大字符串个数是20。(3)将CMyDlg::OnButton1()修改成:上一页下一页返回3.4控件的创建和使用方法voidCMyDlg::OnButton1(){UpdateData();//数据从控件向相关联的成员变量复制//编辑框的内容在按钮上显示图3.25添加数据成员后的界面
m_MyBtn.SetWindowText(m_strEdit);//用下面语句代替上面语句也行,单击//Button1按钮,此按钮上直接显示的就是"//欢迎"//GetDlgItem(IDC_BUTTON1)→SetW//indowText("欢迎");}上一页下一页返回3.4控件的创建和使用方法
(4)编译运行,当在编辑框输入“你好”后,单击Button1按钮,则该按钮的名称就变成了编辑框中的内容“你好”了(可将该程序中的OnCommand函数内容注释掉,不然得再单击一下“确定”按钮),如图3.26所示。说明:(1)UpdateData();默认参数值是TRUE(真),数据从控件向相关联的成员变量复制,若UpdateData(FALSE),数据由控件相关联的成员变量向控件传输。上一页下一页返回3.4控件的创建和使用方法
(2)Category框内可选择Value或Control两种类型。Control所对应的变量类型就是MFC为该控件封装的控件类。Value所对应的是数值类型。不同控件所提供的关联的数值类型各不同,例如:对于编辑框来说,Variablestype中的数值类型有:Cstring(字符串),int,UINT(32位无符号整数),long(32位带符号整数),DWORD(32位无符号整数,段地址和相关的偏移),float,double,BYTE(8位无符号整数),short,BOOL。(3)在DDV/DDX技术中,允许用户为同一个控件关联多个变量,但必须保证这些变量名是互不相同的,且这些变量在同一个类型中不能有多个变量,即在Value和Control类型中各自只能有一个关联变量。上一页下一页返回3.4控件的创建和使用方法
(4)如果添加的关联变量是一个数值类型,则MFCClassWizard对话框的MemberVariables选项卡下方还要求用户输入变量的范围,这就是控件的数据校验设置。例如本例的(2)添加编辑控件的成员变量之后,还在Maximumcharacters文本框输入:20。(5)添加BUTTON1和EDIT1控件的成员变量后,打开“映射控件消息Dlg”类源文件,可以发现MFCClassWizard对上述操作进行了以下3个方面的工作(带阴影部分)。上一页下一页返回3.4控件的创建和使用方法1)在“映射控件消息Dlg.h”文件中,系统已经添加了控件关联变量的声明,即:classCMyDlg:publicCDialog{…… //{{AFX_DATA(CMyDlg) enum{IDD=IDD_MY_DIALOG}; CButton m_MyBtn; CString m_strEdit; //}}AFX_DATA}上一页下一页返回3.4控件的创建和使用方法2)在“映射控件消息Dlg.cpp”文件的构造函数里见到系统已经添加好的代码:CMyDlg::CMyDlg(CWnd*pParent/*=NULL*/):CDialog(CMyDlg::IDD,pParent){//{{AFX_DATA_INIT(CMyDlg) m_strEdit=_T(""); //}}AFX_DATA_INIT …}上一页下一页返回3.4控件的创建和使用方法3)在“映射控件消息Dlg.cpp”文件的DoDataExchange函数体内,系统已经添加了控件的DDX/DDV代码,它们都是一些以DDV_或DDX_开头的函数调用:voidCMyDlg::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlg) //IDC_BUTTON1和其成员变量m_MyBtn进行数据交换
DDX_Control(pDX,IDC_BUTTON1,m_MyBtn); //IDC_EDIT1和其成员变量m_strEdit进行数据交换
上一页下一页返回3.4控件的创建和使用方法DDX_Text(pDX,IDC_EDIT1,m_strEdit); DDV_MaxChars(pDX,m_strEdit,20);//校验m_strEdit的最大字符个数不超过20 //}}AFX_DATA_MAP}其中:①GetDlgItem()是CWnd的成员函数,通过该函数可以得到对话框中某ID号对应的控件的句柄。参数是控件的ID标识符,这里是IDC_BUTTON1(该按钮的ID标识符);②SetWindowText是CWnd的一个成员函数,用于设置窗口(控件)的文本内容。上一页下一页返回3.4控件的创建和使用方法3.4.5控件的通用属性在控件的属性对话框中含有许多属性:General(一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北省沧州市多校联考2025-2026学年高二上学期1月期末考试地理试题(解析版)
- 2026三年级诗词奖励机制设计课件
- 智能家居设备维护保养指南
- 关于合作意向书的回复及后续行动安排函(8篇范文)
- 2026年望闻问切测试题及答案
- 2026年哈弗情商测试题及答案
- 2026年诚信自尊自信测试题及答案
- 2026年登封资助测试题及答案
- 2026年金光博会测试题及答案
- 2026年中学生噪音测试题及答案
- 气切病人脱机训练
- 生物医学新技术临床研究备案指导清单
- 2026年贵州医科大学神奇民族医药学院教师招聘笔试备考试题及答案解析
- 《房屋完损等级评定标准》(试行)
- 审批授权管理制度
- 2026心理危机干预课件
- 内衣采购员管理制度
- 黄金冶炼工艺流程及操作安全规范
- 人工流产术后护理人文关怀
- 国企贸易内控制度
- 小学群文阅读培训课件
评论
0/150
提交评论