《第7章对话框和控件.ppt》由会员分享,可在线阅读,更多相关《第7章对话框和控件.ppt(105页珍藏版)》请在三一办公上搜索。
1、第7章 对话框和控件,版权所有 复制必究,对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互。本章主要介绍对话框的工作原理和编程方法,并通过实例学习一些标准控件和公共控件的使用方法。,7.1 对话框概述,就用户交互输入功能而言,菜单和工具栏的功能是极其有限的。而对话框除了用来显示提示信息(如程序启动时显示版权和运行进度信息),一个主要功能是用于接收用户的输入数据。在MFC中,对话
2、框的功能被封装在CDialog类中,而CDialog类是CWnd类的派生类。作为窗口,对话框和其它窗口一样具有窗口的一切功能。对话框的一个典型应用是通过菜单命令或工具栏按钮打开一个对话框,当然,对话框也可以作为一个程序的主界面。,7.1.1 基于对话框的应用程序,可以直接利用MFC AppWizard向导创建一个基于对话框的应用程序,这种程序运行后首先出现一个对话框。在向导的第一步选择Dialog Based项。此时,应用程序向导将出现与单文档和多文档程序向导不同的操作步骤,因为对话框应用程序一般不包含文档,故不支持数据库和复合文档。按照对话框应用程序向导提示的步骤进行操作就得到一个对话框应用
3、程序项目,出现对话框编辑器和控件工具栏浮动窗口,它们采用的是一种所见即所得的可视化工作方式。利用向导创建应用程序的框架后,程序员可根据程序具体功能要求添加代码。,例 编写一个对话框应用程序MyDialog,程序运行后显示一个对话框,并在对话框上显示文本串。,1执行File|New命令出现New对话框,选择MFC AppWizardexe项,输入程序名MyDialog,单击OK按钮。在随后出现的MFC AppWizard-Step 1对话框窗口中选择Dialog Based选项,单击Finish按钮就创建了应用程序项目,并在Developer Studio中打开了对话框编辑器和控件工具栏。2去掉
4、对话框中标题为“TODO:在这里设置对话控制”的静态文本控件,调整对话框大小,在成员函数CMyDialogDlg:OnPaint()中添加代码。,void CMyDialogDlg:OnPaint().else CPaintDC dc(this);dc.SetBkMode(TRANSPARENT);dc.TextOut(20,50,这是一个对话框应用程序!);CDialog:OnPaint();,7.1.2 对话框类CDialog,MFC提供了一系列对话框类,并实现了对话框消息响应和处理机制。CDialog类是对话框类中最重要的类,我们在程序中创建的对话框类一般都是CDialog类的派生类。C
5、Dialog类还是其它所有对话框类的基类,其派生关系如下所示:CObject CCmdTarget CWnd CDialog,对话框类为程序员提供了管理对话框的编程接口。CDialog类从CWnd类派生而来,所以它继承了CWnd类的成员函数,具有CWnd类的基本功能,可以编写代码移动、显示或隐藏对话框,并能根据对话框的特点增加新的成员函数,扩展它的功能。在你的CDialog类的派生类中可以直接调用CDialog类的成员函数。大部分的成员函数是虚函数,可以在你的派生类中重载,以实现特定的目的。除了CDialog类成员函数,类CWnd和CWinApp也提供了一些成员函数用于对话框的管理。,有关对话
6、框的常用处理函数CDialog:CDialog()通过调用派生类构造函数,根据对话框资源模板定义一个对话框。CDialog:DoModal()激活模态对话框,显示对话框窗口。CDialog:Create()根据对话框资源模板创建非模态对话框窗口。如果对话框不是Visible属性,还需通过调用CWnd:ShowWindow()函数显示非模态对话框窗口。CDialog:OnOk()单击OK按钮时调用该函数,接收对话框输入数据,关闭对话框。CDialog:OnCancel()单击Cancel按钮或按Esc键时调用该函数,不接收对话框输入数据,关闭对话框。,CDialog:OnInitDialog()
7、WM_INITDIALOG消息处理函数,在调用DoModal或Create函数时系统发送WM_INITDIALOG消息,在显示对话框前调用该函数进行初始化。CDialog:EndDialog()用于关闭模态对话框窗口。CWnd:ShowWindow()显示或隐藏对话框窗口CWnd:DestroyWindow()关闭并销毁非模态对话框CWnd:UpdateData()通过调用DoDataExchange()设置或获取对话框控件的数据CWnd:DoDataExchange()被UpdateData()调用以实现对话框数据交换,不能直接调用。,CWnd:GetWindowText()获取对话框窗口的
8、标题CWnd:SetWindowText()修改对话框窗口的标题CWnd:GetDlgItemText()获取对话框中控件的文本内容CWnd:SetDlgItemText()设置对话框中控件的文本内容CWnd:GetDlgItem()获取控件或子窗口的指针CWnd:MoveWindow()用于移动对话框窗口CWnd:EnableWindow()使窗口处于禁用或可用状态,7.1.3 对话框数据交换DDX和验证DDV,在对话框中实现用户数据输入和输出的一般方法是通过ClassWizard类向导将对话框控件与成员变量相关联,利用对话框数据交换DDX(Dialog Data Exchange)和验证D
9、DV(Dialog Data Validation)机制实现数据的输入和输出。当利用ClassWizard类向导添加成员变量时,用户如果在窗口的左下角输入数据的范围,ClassWizard将自动加入函数DDV的调用代码。,例如,当添加一个UINT型的成员变量m_nInput时指定它的最小值和最大值分别为0和100,则ClassWizard类向导将在成员函数DoDataExchange()中添加以下DDV函数的调用语句:DDV_MinMaxUInt(pDX,m_nInput,0,100);程序运行后,如果用户的输入数据超出0100的范围,DDV将显示一个提示信息对话框(例7-2c),提示用户有效
10、的输入范围。,UpdateData()的用法:,当调用UpdateData(TRUE)时,MFC通过调用DDX函数将数据从控件传递到关联的成员变量;当调用UpdateData(FALSE)时,MFC通过调用DDX函数将数据从成员变量传递到关联的的控件。利用UpdateData()函数实现了在刷新后重新获取成员变量。,注意:表面上看程序并没有调用UpdateData(),但是,当程序调用CDialog:DoModal()创建并显示对话框时,将自动调用CDialog:OnInitDialog()完成初始化的工作。在OnInitDialog()中调用了UpdateData(FALSE),将数据从成员
11、变量传递到关联的控件,从而显示在控件中。而单击OK按钮将调用CDialog:OnOk()函数,在OnOK()中调用了UpdateData(TRUE),将数据从控件传递到关联的成员变量。由此看来,不管MFC将DDX技术如何复杂化,我们只需知道,DDX就如同一条双向通道,而方向控制开关就是UpdateData()函数中的BOOL类型参数是TRUE还是FALSE。,7.1.4 提示信息对话框,提示信息对话框也称消息对话框,用来显示有关的提示信息。提示信息对话框是一种最简单的对话框,不需要用户自己创建它就可以直接使用,Visual C+提供了相应的函数实现这样的功能。:int AfxMessageBo
12、x(LPCTSTR lpText,UINT nType=MB_OK,UINT nlDHelp=0);int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT nType);int CWnd:MessageBox(LPCTSTR lpText,LPCTSTR lpCaption=NULL,UINT nType=MB_OK);,这三个函数分别是MFC全局函数、API函数和CWnd类的成员函数,它们的功能基本相同,但适用范围有所不同。AfxMessageBox()和:MessageBox()可以在程序中任何地方使用,而CWnd:Me
13、ssageBox()只能用于控件、对话框、窗口等一些窗口类中。,例如,在软件安装过程中为了弹出如下图所示的警告提示信息对话框并进行相应的处理:,编写的代码如下:int nChoice=MessageBox(文件复制失败!,错误,MB_ICONWARNING|MB_ABORTRETRYIGNORE);switch(nChoice)case IDABORT:/用户按下终止按钮.caseIDRETRY:/用户按下重试按钮.case IDIGNORE:/用户按下忽略按钮.,7.2 使用对话框,为了在屏幕上显示对话框:(1)首先需要建立对话框资源及其与资源相关的对话框类;(2)然后添加控件、与控件关联的
14、成员变量和消息处理函数;(3)最后在程序中显示对话框并访问与控件关联的成员变量。在Visual C+中可以利用集成工具如对话框编辑器和ClassWizard类向导很方便地创建对话框,不需要程序员手工编写太多的源代码。,7.2.1 一般对话框工作流程,当定义了一个对话框类后,就可以利用这个对话框类声明一个对话框对象,即一个能够在屏幕上显示的对话框。声明了一个对话框对象后,可以调用对话框类的成员函数DoModal()建立对话框窗口并显示对话框。例如,假设定义了一个名为CMyDialog的对话框类,为了在屏幕上显示一个对话框,可以编写如下代码:CMyDialog myDlg;myDlg.DoModa
15、l();,函数OnOK()、OnCancel()与DoModal()的关系:对话框中一般都有OK和Cancel按钮,单击OK按钮时调用CDialog:OnOK()函数,单击Cancel按钮时调用CDialog:OnCancel()函数。OnOK()函数和OnCancal()函数都将结束DoModal()函数调用,但令DoModal()返回不同的值。OnOK()函数令DoModal()返回IDOK,OnCancel()函数令DoModal()返回IDCANCAL。用户可以根据DoModal()的返回值做出不同的选择。如:if(myDlg.DoModal()=IDOK),对话框的初始化可以在三个不
16、同的阶段所调用的函数中进行:(1)对话框类构造函数;(2)WM_CREATE消息处理函数;(3)WM_INITDIALOG消息处理函数。通常是在消息WM_INITDIALOG的消息处理函数OnInitDialog()中进行初始化。在收到WM_INIT-DIALOG消息时,对话框的框架已创建,对话框中的每个控件也已建立起来,但它们还没有在屏幕上显示。此时自然可以设置或优化对话框中各个控件的外观、尺寸、位置以及其它属性。函数OnInitDialog()将被成员函数DoModal()调用。,7.2.2 创建对话框,在Windows中对话框是作为一种资源被使用,在程序中要创建一个对话框,首先要创建一个
17、对话框模板资源,然后创建一个基于该对话框模板资源的对话框类。对话框模板资源指定了对话框本身的属性(如大小、位置、风格、类型等)和对话框中的控件及属性,而对话框类规定了对话框和对话框中每个控件的行为。通过对话框模板资源才能创建对话框类和对象。,为了向应用程序项目中添加一个对话框资源,执行Insert|Resource命令或直接按Ctrl+R键,弹出Insert Resource资源列表框。一般要加入通用对话框资源,所以在Insert Resource框中直接选择Dialog项,然后单击New按钮。系统将给对话框资源设置一个默认的ID标识,对话框的默认标题Caption为Dialog,对话框有OK
18、和Cancel两个按钮。,对话框资源的添加:,添加对话框资源的简单方法:,在项目工作区鼠标右击资源项Dialog,从弹出式菜单中选择“Insert Dialog”命令项。,对话框是在对话框模板资源和对话框类的基础上形成的,在完成了对话框的属性和外观设计后,再来设计对话框的行为。我们需要利用ClassWizard类向导创建一个对话框类,并将这个类同先前创建的对话框资源连接起来。在创建对话框类之前或之后,都可以为对话框资源添加控件。而在创建对话框类之后,还可以为对话框资源添加与对话框控件相关联的成员变量和消息处理函数。,创建对话框类:,如果按Ctrl+W键或在对话框资源的非控件区域双击鼠标,Cla
19、ssWizard类向导将发现已添加了一个对话框模板资源,却没有设计其对应的类,因此将弹出Adding a Class对话框,询问用户是否需要利用该对话框资源创建一个对话框类。,Name框:用于输入对话框类的名称;File Name框:列出类的文件名,单击Change按钮可改变文件名;Base class下拉框:列出可选择的基类;Dialog ID下拉框:列出可选择对话框资源的ID。例 假设已利用MFC AppWizard应用程序向导建立了一个名为Mysdi的单文档应用程序,请向应用程序中添加对话框资源和对话框类。,在Adding a Class对话框单击OK按钮,弹出New Class对话框:
20、,1首先向应用程序项目添加一个对话框资源,在项目工作区鼠标右击资源项Dialog,从弹出式菜单中执行Insert Dialog命令,插入一个对话框资源。2设置对话框的属性,将光标指向对话框的空白位置,单击鼠标右键,从弹出式菜单中选择Properties项,或直接按Enter键,弹出Dialog Properties属性对话框。该对话框包括General、Styles、More Styles、Extended Styles、More Extended Styles等页面,用于设置对话框多种不同的属性。3创建对话框类,鼠标双击对话框资源的非控件区域。,7.2.3 添加控件及关联的成员变量,如果没有
21、控件,对话框完成不了什么具体功能,对话框与控件有着密不可分的关系。结合对话框编辑器,利用Controls控件工具栏可给当前正在编辑的对话框模板资源添加控件。若Visual C+窗口中没有出现Controls工具栏,只需将光标指向菜单栏并单击鼠标右键,从弹出式菜单中选择Controls项。控件工具栏上的每一个图标都代表了一种控件,如果不能确定控件的类型,只要将光标在该控件图标上停留片刻,就会显示该控件类型的提示。,向对话框添加控件时,先在Controls工具栏单击要添加的控件,再将光标指向对话框空白区域并单击鼠标。,添加与控件关联的成员变量,在生成自己的对话框类并添加需要的控件后,可以利用Cla
22、ssWizard类向导在对话框类的定义中为对话框资源上的每一个控件添加一个或多个对应的成员变量。ClassWizard类向导的Member Variables页面主要用来为对话框类添加和删除与对话框控件关联的成员变量,我们在编写对话框程序时经常同该页面打交道。,Class name下拉框:选择要添加成员变量的对话 框类;Control IDs栏:选择控件,因为要添加的成员变量总是与一个对话框控件ID联系在一起,它们代表控件对象本身或控件的某项属性;Add Variable按钮:添加与控件关联的成员变量;Delete Variable按钮:删除控件的某个成员变量。Control IDs栏:列出对
23、话框资源上已有的控件,第1列Control IDs表示控件的ID,第2列Type表示变量的类型,第3列Member表示成员变量名。,在Member Variables页面:,Add Member Variable对话框,Member variable name框:输入成员变量名;Category下拉框:选择成员变量的类别,可为Control或 Value;Variable type下拉框:选择成员变量的类型。,如果在Category下拉框选择Value项,表示要为该控件的某项属性定义一个变量,这意味着程序关心的是控件中的值,而不是控件对象本身。这时,还可以通过Variable type下拉框为
24、变量选择不同的类型,可以选择一般的C+数据类型或Visual C+自定义的数据类型。例如,对于编辑框控件,此时成员变量的类型可以是int、float、long、BOOL等C+一般数据类型或者是UINT、CString等Visual C+自定义数据类型。,如果在Category下拉框中选择Control项,则表示定义的变量代表控件对象本身,Control类别的变量实质是一个控件对象,其类型是MFC控件类。例如,对于编辑框控件,此时成员变量的类型为CEdit。因此,可以通过添加的控件对象访问控件类的成员变量和调用控件类的成员函数,实现对控件行为的控制和管理。,可以为一个控件同时定义一个Contro
25、l类别的变量和一个Value类别的变量。这些变量都是作为对话框派生类的成员变量,为了在程序其它地方能够直接访问添加的成员变量,它们都被声明为public属性。,例 完善Mysdi程序,向对话框资源添加需要使用的控件,并添加与控件关联的成员变量。,1向对话框资源添加控件。添加一个静态文本控件,其Caption为“请输入半径”。添加一个Edit Box编辑框控件,其ID标识为IDC_EDIT_ RADIUS,该控件用于接收用户的输入数据。2添加与控件关联的成员变量。按Ctrl+W键启动ClassWizard类向导,单击Member Variables标签。在Class name下拉框选择类CRad
26、iusDialog,在Control IDs栏选择编辑框IDC_EDIT_RADIUS,单击Add Variable按钮。通过Add Member Variable对话框添加成员变量m_nRadius,其数据类型为UINT。3使用对话框数据验证DDV功能,在该页面的左下角输入成员变量m_nRadius的最小值5和最大值250。,例 完善Mysdi程序,通过“编辑”菜单中的“输入半径(I)”命令打开上述标题为“输入半径”的对话框,并根据输入的半径画一个圆。1为了在视图对象中接收并存储对话框编辑控件的值,在视图类CMysdiView中手工定义一个UINT类型的成员变量m_nCViewRadius。
27、2利用菜单编辑器在“编辑”菜单增加一个菜单项“输入半径(I)”,其ID标识为ID_EDIT_INPUTRADIUS,Caption为“输入半径(&I).”。按Ctrl+W键启动ClassWzard类向导,在视图类中为ID_EDIT_INPUTRADIUS菜单项添加消息COMMAND的处理函数,在函数中添加代码。,在程序中使用创建的对话框,void CMysdiView:OnEditInputradius()/TODO:Add your command handler code here CRadiusDialog dlg;/定义一个对话框对象 dlg.m_nRadius=100;/设置编辑框显
28、示的初始值 if(dlg.DoModal()=IDOK)/显示对话框 m_nCViewRadius=dlg.m_nRadius;/接收并存储编辑框数据 Invalidate();/刷新视图,3在视图类构造函数CMysdiView:CMysdiView()中将成员变量m_nCViewRadius初始化为0。在函数CMysdiView:OnDraw()中添加如下画圆的语句:pDC-Ellipse(0,0,2*m_nCViewRadius,2*m_nCViewRadius);在视图类实现文件MysdiView.cpp的开始位置加入包含对话框类头文件的语句:#include RadiusDialog.
29、h”,模态对话框在关闭之前,不允许用户切换到程序的其它窗口。因为当弹出模态对话框时,它就获得了程序的控制权,并且,模态对话框拥有自己的消息循环,因此其窗口中所有产生的消息都不会送到主窗口的消息循环。非模态对话框弹出后,用户不需要关闭它就可以在非模态对话框和应用程序其它窗口之间进行切换。常用的Find查找和Replace替换对话框就是非模态对话框。如果关闭非模态对话框的父窗口,非模态对话框一般也自动关闭。,7.2.4 非模态对话框,对于非模态对话框,使用对话框编辑器创建对话框资源和使用ClassWizard类向导添加对话框类、成员变量和消息处理函数的方法与模态对话框一样,但创建和退出对话框的方式
30、有所不同。创建模态对话框时是由系统自动分配内存空间,因此在退出对话框时,系统自动调用CDialog:EndDialog()函数来删除对话框。而创建非模态对话框则需要用户来分配内存,退出时还需用户自己删除非模态对话框。,非模态对话框的创建,非模态对话框的实例应声明为全局对象,不能象模态对话框那样作为局部对象。一般用new操作符生成,使用结束时用delete操作符将其删除。区别于模态对话框,非模态对话框用new生成对象后,不是调用CDialog:DoModal()函数,而是调用CDialog:Create()函数装入对话框资源,并创建和显示对话框。Create()函数在显示非模态对话框后就立即返回
31、,而DoModal()函数是在模态对话框被关闭之后才返回。并且,由于Create()函数不会启动新的消息循环,非模态对话框与应用程序共用一个消息循环,这样,非模态对话框就不会垄断用户的输入。,Windows将一些常用的对话框集成到操作系统中,作为Windows公用对话框库Commdlg.dll的一部分。用户在程序中可以直接使用这些公用对话框,不必再创建对话框资源和对话框类,减少了大量的编程工作。并且,用户还可以定制公用对话框的外观和性能。为了在MFC应用程序中使用公用对话框,MFC提供了封装这些公用对话框的类。这些公用对话框类都是从CCommonDialog类派生而来,而CCommonDial
32、og类又是CDialog类的派生类。,7.2.5 公用对话框,公用对话框,7.3 标准控件,Windows提供的控件分为两类:标准控件和公共控件。标准控件:静态控件、编辑框、按钮、列表框、组合框和滚动条等。利用标准控件可满足大部分用户界面程序设计的要求。公共控件:滑块、进度条、列表视控件、树视控件和标签控件等,利用公共控件实现应用程序用户界面风格的多样性。,7.3.1 控件概述,控件是Windows提供的完成特定功能的独立小部件,它使应用程序对话功能的设计更容易完成,在对话框与用户的交互过程中担任主要角色,用于完成用户输入和程序运行过程中的输出。控件对应一个CWnd派生类的对象,它实际上也是一
33、个窗口,可以通过调用窗口类的成员函数实现控件的移动、显示或隐藏、禁用或可用等操作,也可以重新设置它们的尺寸和风格等属性。MFC以类的形式对标准控件和公共控件进行了封装,这些类大部分是从CWnd类直接派生而来。,常用的MFC控件类,常用的MFC控件类,控件通知Notification消息:,用户对控件的操作将引发控件事件,Windows产生对应的控件通知Notification消息,消息由其父窗口(如对话框)接收并处理。标准控件发送WM_COMMAND控件通知消息,公共控件一般发送WM_NOTIFY控件通知消息,有时也发送WM_COMMAND消息。通过WM_COMMAND消息参数标识发出消息的控
34、件和具体的事件,消息参数中包含了控件的ID标识和通知码(如BN_CLICKED单击按钮事件)。控件通知码前缀最后一个字母为N。程序员不必关心消息具体的发送和接收,只需利用ClassWizard将控件映射到成员变量,将控件消息映射到成员函数,然后编写具体的处理代码。,控件的创建方法:,控件在程序中可作为对话框控件或独立的窗口两种形式存在,因此,控件的创建方法也有两种。一种方法是在对话框模板资源中指定控件,这样当应用程序创建对话框时,Windows就会为对话框创建控件,编程时我们一般都采用这种方法。一种方法是通过调用MFC控件类的成员函数Create()创建控件,也可以调用API函数CreateW
35、indow()或CreateWindowEx()创建控件。控件也可以用于其它窗口,如在程序视图窗口显示控件。这时,需要首先声明一个MFC控件类的对象,然后调用Create()函数创建控件。,7.3.2 控件的组织,1.添加或删除控件 打开对话框编辑器和控件工具栏,在控件工具栏中单击要添加的控件,此时,当光标指向对话框时将变成十字形状,在对话框指定位置处单击鼠标左键,则该控件被添加到对话框中指定的位置。也可以将光标指向控件工具栏中的控件,然后按住鼠标不放,采用鼠标拖曵的方法将控件拖入到对话框中。要删除已添加的控件,先单击对话框中的控件,再按Delete键即可删除指定的控件。,2.设置控件属性 将
36、光标指向对话框中需设置属性的控件,按回车键(或右击鼠标,在弹出式菜单中选择Properties项)弹出Properties对话框,在Properties对话框中设置控件属性。可以将属性对话框始终保持打开,只需要按下属性对话框左上角的图钉按钮。3.调整控件的大小 对于静态文本控件,当输入标题内容时,控件的大小会自动改变。对于其它控件,先单击控件,然后利用控件周围的尺寸调整点来改变控件的大小。所选对象的位置和大小将显示在状态栏的右端。,4.同时选取多个控件 一种方法是在对话框内按住鼠标不放,拖曵出一个大的虚线框,然后释放鼠标,则被该虚线框所包围的控件都将被同时选取;另一种方法是按住Shift(或C
37、trl)键不放,然后用鼠标连续选取控件。5.移动和复制控件 当单个或多个控件被选取后,按方向键或用鼠标拖动选择的控件可移动控件。若在鼠标拖动过程中按住Ctrl键则复制控件,复制的控件保持原来控件的大小和属性。并且,控件能够通过复制和粘贴操作而加入到其它对话框中。,6.编排控件 编排控件主要是指同时调整对话框中一组控件的大小或位置。编排控件有两种方法,一种方法是使用控件布局工具栏,自动编排对话框中同时选定的多个控件;另一种方法是使用Layout菜单,当打开对话框编辑器时,Layout菜单将出现在菜单栏上。为了便于用户在对话框内精确定位各个控件,系统还提供了网格、标尺等辅助功能。测试对话框和控件的
38、方法:通过按下Ctrl+T组合键就能测试对话框运行时的界面效果。,7.3.3 控件共有属性,控件的属性决定了控件的外观和功能,我们只有通过控件属性对话框才能设置控件的属性。控件属性对话框上有若干选项卡,如General(通用属性)、Style(风格)及Extend Styles(扩展风格)选项卡等,其中General页用于设置控件的通用属性,Styles和Extendcd Styles页用来设置控件的外观和辅助属性。不同控件有不同的属性,但它们都具有通用属性,如控件标识ID、标题Caption等项,,控件的General属性,7.3.4 静态控件,静态控件(Static control)是用来
39、显示一个文本串或图形信息的控件,它包括静态文本控件、图片控件和组框。静态文本控件用来显示一般不需要变化的文本;图片控件用来显示边框、矩形、图标或位图等图形;组框用来显示一个文本标题和一个矩形边框,通常用来作为一组控件周围的虚拟边界,并将一组控件组织在一起。管理静态文本控件和图片控件的MFC类是CStatic类,而管理组框的MFC类是CButton类。,所有静态控件默认的ID标识都为IDC_STATIC,如果要为一个静态控件添加成员变量或消息处理函数,必须重新为它指定一个唯一的ID标识。编程时用的最多是静态文本控件,它被用来作为其它控件的标题。每一个静态文本控件最多可以显示255个字符,可以使用
40、“n”换行符,并可以通过Styles页面设置控件的风格。,7.3.5 编辑框,编辑框(Edit box)又称文本框或编辑控件,它一般与静态文本控件一起使用,用于数据的输入和输出。编辑框提供了完整的键盘输入和编辑功能,可以输入各种文本、数字或者口令。编辑框为用户提供了良好的输入、输出功能,能够将键盘输入的字符串转化为要求的数据类型,并验证它是否符合输入要求(字符串长度或数值范围)。通过前述对话框内容的学习我们已经知道,完成上述工作是利用了MFC提供的对话框数据交换(DDX)和数据验证(DDV)技术。,编辑框常用属性:Multiline设置单行或多行编辑,Align text设置文本对齐方式,Nu
41、mber表示只能输入数字,Password表示键入编辑框的字符都将显示为“*”,Uppercase或Lowercase表示键入编辑框的字符全部转换成大写或小写形式,Read-Only表示只能输出数据。当编辑框的文本被修改,会向父窗口发送消息,可以利用ClassWizard在对话框类中添加消息处理函数。编辑框发送消息有:EN_CHANGE、EN_KILLFOCUS、EN_SETFOCUS、EN_MAX TEXT、EN_UPDATE等。,例 编写一个SDI应用程序Password,程序启动后首先弹出一个如图所示的用户身份确认对话框,当用户键入正确的口令后才能进入程序的主界面。,7.3.6 按钮,按
42、钮(Button)包括按键按钮、单选按钮、复选框和组框等4种类型。虽然封装按钮控件的MFC类都是CButton类,但它们具有不同的功能。按键按钮在被按下时会立即执行某个命令,也被称为命令按钮;单选按钮用于在一组互相排斥的选项中选择其中一项;复选框用于在一组选项中选择其中一项或多项;组框可以使一组控件关联起来。,1.按键按钮,几乎所有的对话框都使用简单的按键按钮,如OK按钮。通过Properties对话框可以设置按钮的不同风格,如通过设置Default button属性设置一个默认按钮。默认按钮是指当对话框刚显示时的命令执行按钮,此时按下Enter键将执行该按钮的命令功能。一个对话框只能有一个D
43、efault button默认按钮,通常情况下将OK按钮设置为默认按钮。其它属性:Owner draw利用WM_DRAWITEM消息处理函数定制按钮的外观,Icon表示用图标代替原来的文本标题,Bitmap表示用位图代替原来的文本标题,Client edge、Static edge、Modal frame用于设置按钮的外观。,2.单选按钮,单选按钮是由一个圆圈和紧随其后的文本标题组成,当它被选中时,圆圈中就标上一个黑点。单选按钮设置Auto自动属性为默认属性,Auto属性表示用户若选中同组中的某个单选按钮,则自动清除其余单选按钮的选中状态,保证一组选项中始终只有一项被选中。一般将一组单选按钮放
44、在一个组框中,在一组单选按钮中,第一个(Tab键顺序)按钮最重要,其ID值可用于在对话框中为控件建立关联的成员变量。必须为同组中的第一个单选按钮设置Group属性,而同组的其它单选按钮不可再设置Group属性。,3.复选框,复选框是由一个空心方框和紧随其后的文本组成,当它被选中时,空心方框中就加上一个“”或“”标记。不同于单选按钮,在一组复选框中每次可以同时选择多项。除了选中和没选中两种状态,复选框还有第三种状态,此时选中标记显示为暗色,它表示该项不可以由用户选择。通过设置Tri-state属性得到这种三态复选框。另外,我们可以通过设置Push-like属性使单选按钮或复选框具有普通按钮的外观
45、。,按钮控件发送的消息:,按钮控件只能发送通知码为BN_CLICKED(单击按钮)和BN_DOUBLECLICKED(双击按钮)的WM_COMMAND消息,我们经常需要编写按钮的BN_CLICKED消息处理函数。CButton类提供了一些成员函数实现对按钮控件对象的控制和管理,如利用成员函数GetCheck()或SetCheck()获取或设置单选按钮或复选框的当前状态,利用成员函数GetButtonStyle()或SetButtonStyle()获取或改变按钮控件的风格。,例 编写一个对话框应用程序ColrButn,对话框中有两个用于选择颜色模式的单选按钮和三个用于选择具体颜色的复选框,只有在
46、彩色模式下才能选择三种不同颜色的组合。当用户单击“应用”按钮,对话框右边的按键按钮将根据选择的颜色实现按钮的自画。,7.3.7 列表框,Windows提供了几个列表类型控件,如列表框、组合框、列表视控件和树视控件,其中列表框是一种最简单的列表类型控件。列表框(List box)是一个列出了一些文本项的窗口,常用来显示类型相同的一系列清单,如文件、字体和用户等。与复选框类似,用户可以选择其中一项或多项,但同时列表框中选项的数目和内容可以动态变化,用户可往列表框中添加或删除某些选项。列表框有单选Single、多选Multiple、扩展多选Extended、不选None四种风格,在控件Propert
47、ies属性对话框的Selection下拉框中设置。,当列表框中发生了某个事件,列表框就会向其父窗口发送一条通知消息。列表框常用的通知消息有:用户双击列表框中的列表项时发送消息LBN_DBLCLK,列表框失去键盘输入焦点时发送消息LBN_KILLFOCUS,列表框获得键盘输入焦点时发送消息LBN_SETFOCUS,列表框中的当前选择项发生改变时发送消息LBN_SELCHANGE。封装列表框控件的MFC类是CListBox类,当列表框创建之后,在程序中可以通过调用CListBox类成员函数来实现列表项的添加、删除、修改和获取等操作。,例 编写一个对话框应用程ExmpList,对话框中有一个列表框,
48、当用户单击列表框中的一个列表项(一个国家)时,在四个编辑框分别显示指定国家的名称、首都、面积和人口。单击“添加”按钮时,“国家”编辑框中的文本将被添加到列表框中;单击“删除”按钮时,当前的列表项将被删除。,7.3.8 组合框,编辑框和列表框在使用时受到一些限制,编辑框允许用户输入文本内容,但用户却不能直接选择以前已输入的文本内容。列表框可列出各种可能的选项,但用户却不能在列表框中输入新的列表项。而组合框(Combo box)吸收了列表框和编辑框的优点,它可以显示列表项供用户进行选择,也允许用户输入新的列表项。实质上,组合框是多个控件的组合,包括编辑框、列表框和按钮。组合框有简单组合框(Simp
49、le)、下拉组合框(Dropdown)和下拉列表框(Drop List)等三种形式,通过控件Properties属性对话框Styles页面的Type下拉框设置这三种形式。,组合框控件的Data属性:,与编辑框或列表框相比,组合框有一个新的功能属性,可以通过组合框控件属性对话框的Data页面添加初始的列表项。注意,每输入完一个列表项,按下Ctrl+Enter键后才能换行输入下一项。也可以在对话框类的初始化成员函数OnInitDialog()中编写代码添加列表项。,组合框发送的消息:,组合框消息有:关闭组合框消息CBN_CLOSEUP,打开列表框消息CBN_DROPDOWN,双击列表项消息CBN_
50、DBLCLK,选择一个列表项并按下Enter键或单击下拉按钮隐藏列表框时发送消息CBN_SELENDOK,当前选项被取消时(如重新选择其它控件或关闭对话框)发送消息CBN_SELENDCANCEL,当前选项改变消息CBN_SELCHANGE;当组合框的编辑框中的文本被修改且新的文本显示之后发送消息CBN_EDIT CHANGE,当编辑框中的文本被修改且新的文本显示之前发送消息CBN_EDITUPDATE;组合框失去键盘输入焦点消息CBN_KILLFOCUS,组合框获得键盘输入焦点消息CBN_SETFOCUS。,例 编写一个单文档应用程序ExmpCombo,执行“测试控件|组合框”菜单命令时打开