第8章对话框和控件_第1页
第8章对话框和控件_第2页
第8章对话框和控件_第3页
第8章对话框和控件_第4页
第8章对话框和控件_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、第八章第八章 对话框和控件对话框和控件对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互。本章主要介绍对话框的工作原理和编程方法,并通过实例学习一些标准控件和公共控件的使用方法。8.1 8.1 对话框概述对话框概述对话框的主要功能是用于接收用户的输入数据。在MFC中,对话框的功能被封装在CDialog类中,而CDialog类是CWnd类的派生类。作为窗口,对话框和其它窗口一样具有

2、窗口的一切功能。对话框的一个典型应用是通过菜单命令或工具栏按钮打开一个对话框。当然,对话框也可以作为一个程序的主界面。8.1.1 8.1.1 基于对话框的应用程序基于对话框的应用程序可以直接利用MFC AppWizard向导创建一个基于对话框的应用程序,这种程序运行后首先出现一个对话框。在向导的第一步选择Dialog Based项。此时,应用程序向导将出现与单文档和多文档程序向导不同的操作步骤,因为对话框应用程序一般不包含文档,故不支持数据库和复合文档。按照对话框应用程序向导提示的步骤进行操作就得到一个对话框应用程序项目,出现对话框编辑器和控件工具栏浮动窗口,它们采用的是一种所见即所得的可视化

3、工作方式。示例:demo8_18.1.2 8.1.2 对话框类对话框类CDialogCDialogMFC提供了一系列对话框类,并实现了对话框消息响应和处理机制。CDialog类是对话框类中最重要的类,我们在程序中创建的对话框类一般都是CDialog类的派生类。CDialog类还是其它所有对话框类的基类,其派生关系如下所示:CObjectCCmdTargetCWndCDialog对话框类为程序员提供了管理对话框的编程接口。CDialog类从CWnd类派生而来,所以它继承了CWnd类的成员函数,具有CWnd类的基本功能,可以编写代码移动、显示或隐藏对话框,并能根据对话框的特点增加新的成员函数,扩展

4、它的功能。在CDialog类的派生类中可以直接调用CDialog类的成员函数。大部分的成员函数是虚函数,可以在派生类中重载,以实现特定的目的。除了CDialog类成员函数,类CWnd和CWinApp也提供了一些成员函数用于对话框的管理。对话框的常用处理函数对话框的常用处理函数l CDialog:CDialog(),通过调用派生类构造函数,根据对话框资源模板定义一个对话框。l CDialog:DoModal(),激活模态对话框,显示对话框窗口。l CDialog:Create(),根据对话框资源模板创建非模态对话框窗口。l CDialog:OnOk(),单击OK按钮时调用该函数,接收对话框输入数

5、据,关闭对话框。l CDialog:OnCancel(),单击Cancel按钮或按Esc键时调用该函数,不接收对话框输入数据,直接关闭对话框。l CDialog:OnInitDialog(),WM_INITDIALOG消息处理函数,在调用DoModal或Create函数时系统发送WM_INITDIALOG消息,在显示对话框前调用该函数进行初始化。l CDialog:EndDialog(),用于关闭模态对话框窗口。l CWnd:ShowWindow(),显示或隐藏对话框窗口。l CWnd:DestroyWindow(),关闭并销毁非模态对话框。l CWnd:UpdateData(),通过调用Do

6、DataExchange()设置或获取对话框控件的数据。l CWnd:DoDataExchange(),被UpdateData()调用以实现对话框数据交换,不能直接调用。l CWnd:GetWindowText(),获取对话框窗口的标题。l CWnd:SetWindowText(),修改对话框窗口的标题。l CWnd:GetDlgItemText(),获取对话框中控件的文本内容。l CWnd:SetDlgItemText(),设置对话框中控件的文本内容。l CWnd:GetDlgItem(),获取控件或子窗口的指针。l CWnd:MoveWindow(),用于移动对话框窗口。l CWnd:En

7、ableWindow(),使窗口处于禁用或可用状态。8.1.3 8.1.3 对话框数据交换对话框数据交换DDXDDX和验证和验证DDVDDV在对话框中实现用户数据输入和输出的一般方法是通过“添加变量”向导将对话框控件与成员变量相关联,利用对话框数据交换DDX(Dialog Data Exchange)和验证DDV(Dialog Data Validation)机制实现数据的输入和输出。当利用向导添加成员变量时,用户如果输入了 数据的范围,则向导将自动加入函数DDV的调用代码。示例:demo8_2UpdateData()UpdateData()的用法的用法当调用UpdateData(TRUE)时

8、,MFC通过调用DDX函数将数据从控件传递到关联的成员变量;当调用UpdateData(FALSE)时,MFC通过调用DDX函数将数据从成员变量传递到关联的控件。对话框程序确 定取 消请输入数据:成员变量对话框对象UpdateData(FALSE)UpdateData(TRUE)更新后重新获取成员变量初始化成员变量8.1.4 8.1.4 提示信息对话框提示信息对话框提示信息对话框也称消息对话框,用来显示有关的提示信息。提示信息对话框是一种最简单的对话框,不需要用户自己创建它就可以直接使用。Visual C+提供了相应的函数实现这样的功能。int AfxMessageBox(LPCTSTR lp

9、Text, UINT nType=MB_OK, UINT nIDHelp=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:MessageB

10、ox()只能用于控件、对话框、窗口等一些窗口类中。示例:demo8_38.2 8.2 使用对话框使用对话框为了在屏幕上显示对话框,要进行以下步骤:建立对话框资源及其与资源相关的对话框类;添加控件、与控件关联的成员变量和消息处理函数;1. 在程序中显示对话框并访问与控件关联的成员变量;8.2.1 8.2.1 一般对话框工作流程一般对话框工作流程当定义了一个对话框类后,就可以利用这个对话框类声明一个对话框对象,即一个能够在屏幕上显示的对话框。声明了一个对话框对象后,可以调用对话框类的成员函数DoModal()建立对话框窗口并显示对话框。对话框中一般都有OK和Cancel按钮,单击OK按钮时调用CD

11、ialog:OnOK()函数,单击Cancel按钮时调用CDialog:OnCancel()函数。OnOK()函数和OnCancel()函数都将结束DoModal()函数调用,但令DoModal()返回不同的值。对话框的初始化可以在三个不同的阶段所调用的函数中进行:l 对话框类构造函数l WM_CREATE消息处理函数l WM_INITDIALOG消息处理函数通常是在消息WM_INITDIALOG的消息处理函数OnInitDialog()中进行初始化。在收到WM_INITDIALOG消息时,对话框的框架已创建,对话框中的每个控件也已建立起来,但它们还没有在屏幕上显示。此时自然可以设置或优化对话

12、框中各个控件的外观、尺寸、位置以及其它属性。函数OnInitDialog()将被成员函数DoModal()调用。对话框初始化对话框初始化8.2.2 8.2.2 创建对话框创建对话框在Windows中对话框是作为一种资源被使用,在程序中要创建一个对话框,首先要创建一个对话框模板资源,然后创建一个基于该对话框模板资源的对话框类。对话框模板资源指定了对话框本身的属性(如大小、位置、风格、类型等)和对话框中的控件及属性,而对话框类规定了对话框和对话框中每个控件的行为。通过对话框模板资源才能创建对话框类和对象。示例:demo8_48.2.3 8.2.3 添加控件添加控件如果没有控件,对话框完成不了什么具

13、体功能,对话框与控件有着密不可分的关系。结合对话框编辑器,利用Controls控件工具栏可给当前正在编辑的对话框模板资源添加控件。控件工具栏上的每一个图标都代表了一种控件,如果不能确定控件的类型,只要将光标在该控件图标上停留片刻,就会显示该控件类型的提示。8.2.4 8.2.4 关联成员变量关联成员变量给一个控件添加成员变量在之前已有说明,这里主要讲解添加成员变量的种类(Category):Value和Control。如果选择了Value项,表示要为该控件的某项属性定义一个变量,这意味着程序关心的是控件中的值,而不是控件对象本身。这时,还可以为变量选择不同的类型(Type),可以选择一般的C+

14、数据类型(int、float、long等)或Visual C+自定义的数据类型(UINT、CString等)。如果选择了Control项,则表示定义的变量代表控件对象本身,Control类别的变量实质是一个控件对象,其类型是MFC控件类。可以为一个控件同时定义一个Control和一个Value类别的变量。8.2.5 8.2.5 非模态对话框非模态对话框模态对话框在关闭之前,不允许用户切换到程序的其它窗口。因为当弹出模态对话框时,它就获得了程序的控制权。并且,模态对话框拥有自己的消息循环,因此其窗口中所有产生的消息都不会送到主窗口的消息循环。非模态对话框弹出后,用户不需要关闭它就可以在非模态对话

15、框和应用程序其它窗口之间进行切换。如果关闭非模态对话框的父窗口,非模态对话框一般也自动关闭。对于非模态对话框,使用对话框编辑器创建对话框资源和使用ClassWizard类向导添加对话框类、成员变量和消息处理函数的方法与模态对话框一样,但创建和退出对话框的方式有所不同。创建模态对话框时是由系统自动分配内存空间,因此在退出对话框时,系统自动调用CDialog:EndDialog()函数来删除对话框。而创建非模态对话框则需要用户来分配内存,退出时还需用户自己删除非模态对话框。创建非模态对话框创建非模态对话框非模态对话框的实例应声明为全局变量或成员变量,不能像模态对话框那样作为局部变量。一般用new操

16、作符生成,使用结束时用delete操作符将其删除。区别于模态对话框,非模态对话框用new生成对象后,不是调用CDialog:DoModal()函数,而是调用CDialog:Create()函数装入对话框资源,并创建和显示对话框。Create()函数在显示非模态对话框后就立即返回,而DoModal()函数是在模态对话框被关闭之后才返回。并且,由于Create()函数不会启动新的消息循环,非模态对话框与应用程序共用一个消息循环。这样,非模态对话框就不会垄断用户的输入。示例:demo8_58.2.6 8.2.6 公用对话框公用对话框Windows将一些常用的对话框集成到操作系统中,作为Windows

17、公用对话框库Commdlg.dll的一部分。用户在程序中可以直接使用这些公用对话框,不必再创建对话框资源和对话框类,减少了大量的编程工作。并且,用户还可以定制公用对话框的外观和性能。为了在MFC应用程序中使用公用对话框,MFC提供了封装这些公用对话框的类。这些公用对话框类都是从CCommonDialog类派生而来,而CCommonDialog类又是CDialog类的派生类。MFC公用对话框类公用对话框类说明说明CColorDialog颜色设定对话框,选择不同的颜色CFileDialog文件存取对话框,打开或保存文件CFindReplaceDialog查找和替换对话框,查找和替换文本串CFont

18、Dialog字体设定对话框,选择不同的字体CPageSetupDialog页面设置对话框,设置页码、页眉等CPrintDialog标准的打印对话框,用于打印和打印设置COleDialog该类及其派生类用于生成OLE对话框示例:demo8_68.3 8.3 标准控件标准控件Windows提供的控件分为两类:标准控件和公共控件。标准控件包括静态控件、编辑框、按钮、列表框、组合框和滚动框。利用标准控件可满足大部分用户界面程序设计的要求。公共控件包括滑块、进度条、列表视控件、树视控件和标签控件等,利用公共控件实现应用程序用户界面风格的多样性。8.3.1 8.3.1 控件概述控件概述控件是Windows

19、提供的完成特定功能的独立小部件,它使应用程序对话功能的设计更容易完成,在对话框与用户的交互过程中担任主要角色,用于完成用户输入和程序运行过程中的输出。控件对应一个CWnd派生类的对象,它实际上也是一个窗口,可以通过调用窗口类的成员函数实现控件的移动、显示或隐藏、禁用或可用等操作,也可以重新设置它们的尺寸和风格等属性。MFC以类的形式对标准控件和公共控件进行了封装,这些类大部分是从CWnd类直接派生而来。MFC控件类控件类控件名控件名CStatic静态文本、图片控件CEdit编辑框CButton按钮、复选框、单选按钮、组框CComboBox组合框CList列表框CScrollBar滚动条CPro

20、gressCtrl进度条CSliderCtrl滑块CListCtrl列表视控件CTreeCtrl树视控件CTabCtrl标签CDateTimeCtrl日期时间选取器用户对控件的操作将引发控件事件,Windows产生对应的控件通知Notification消息,消息由其父窗口(如对话框)接收并处理。标准控件发送WM_COMMAND控件通知消息,公共控件一般发送WM_NOTIFY控件通知消息。通过WM_COMMAND消息参数标识发出消息的控件和具体的事件,消息参数中包含了控件的ID标识和通知码(如BN_CLICKED单击按钮事件)。控件通知码前缀最后一个字母为N。程序员不必关心消息具体的发送和接收,

21、只需将控件映射到成员变量,将控件消息映射到成员函数,然后编写具体的处理代码。控件通知控件通知NotificationNotification消息消息控件在程序中可作为对话框控件或独立的窗口两种形式存在,因此,控件的创建方法也有两种。l 在对话框模板资源中指定控件,这样当应用程序创建对话框时,Windows就会为对话框创建控件。编程时我们一般都采用这种方法。l 通过调用MFC控件类的成员函数Create()创建控件,也可以调用API函数CreateWindow()或CreateWindowEx()创建控件。控件的创建控件的创建8.3.2 8.3.2 控件的组织控件的组织打开对话框编辑器和控件工具

22、栏,在控件工具栏中单击要添加的控件,在对话框指定位置处单击鼠标左键,则该控件被添加到对话框中指定的位置。也可以通过拖拽控件到对话框指定位置的方式来添加控件。要删除已添加的控件,先单击对话框中的控件,再按Delete键即可删除。添加和删除控件添加和删除控件将光标指向对话框中需设置属性的控件,按回车键(或右击鼠标,在弹出式菜单中选择Properties项)弹出Properties对话框,在Properties对话框中设置控件属性。可以将属性对话框始终保持打开,只需要按下属性对话框左上角的图钉按钮。设置控件属性设置控件属性对于静态文本控件,当输入标题内容时,控件的大小会自动改变。对于其它控件,先单击

23、控件,然后利用控件周围的尺寸调整点来改变控件的大小。调整控件的大小调整控件的大小当单个或多个控件被选取后,按方向键或用鼠标拖动选择的控件可移动控件。若在鼠标拖动过程中按住Ctrl键则复制控件,复制的控件保持原来控件的大小和属性。并且,控件能够通过复制和粘贴操作而加入到其它对话框中。移动和复制控件移动和复制控件编排控件主要是指同时调整对话框中一组控件的大小或位置。使用控件布局工具栏自动编排对话框中同时选定的多个控件。编排控件编排控件8.3.3 8.3.3 控件共有属性控件共有属性控件的属性决定了控件的外观和功能,我们只有通过控件属性对话框才能设置控件的属性。控件属性对话框上有若干选项卡,如行为、

24、外观、杂项等。不同控件有不同的属性,但它们都具有通用属性,如下所示:项目项目说明说明ID控件的标识,对话框编辑器会为每一个加入的控件分配一个默认的IDCaption控件的标题,程序执行时在控件位置上显示的文本Visible指明显示对话框时该控件是否可见Group用于指定一个控件组中的第一个控件Disabled指定控件初始化时是否禁用Tab Stop表示对话框运行后该控件可以通过使用Tab键来获取焦点8.3.4 8.3.4 静态控件静态控件静态控件(Static Control)是用来显示一个文本串或图形信息的控件,它包括静态文本控件、图片控件和组框。静态文本控件用来显示一般不需要变化的文本;图

25、片控件用来显示边框、矩形、图标或位图等图形;组框用来显示一个文本标题和一个矩形边框,通常用来作为一组控件周围的虚拟边界,并将一组控件组织在一起。管理静态文本控件和图片控件的MFC类是CStatic类,而管理组框的MFC类是CButton类。所有静态控件默认的ID标识都为IDC_STATIC,如果要为一个静态控件添加成员变量或消息处理函数,必须重新为它指定一个唯一的ID标识。8.3.5 8.3.5 编辑框编辑框编辑框(Edit Box)又称文本框或编辑控件,它一般与静态文本控件一起使用,用于数据的输入和输出。编辑框提供了完整的键盘输入和编辑功能,可以输入各种文本、数字或口令。编辑框为用户提供了良

26、好的输入、输出功能,能够将键盘输入的字符串转化为要求的数据类型,并验证它是否符合输入要求(字符串长度或数值范围)。编辑框常用属性有:Multiline设置单行/多行编辑,Align Text设置文本对齐方式,Number表示只能输入数字,Password表示键入的字符都显示为“*”,Uppercase或Lowercase表示大写/小写形式,Read-Only只能输出数据。当编辑框的文本被修改,会向父窗口发送消息,这些消息有:EN_CHANGE、EN_KILLFOCUS、EN_SETFOCUS、EN_MAXTEXT、EN_UPDATE等。示例:demo8_78.3.6 8.3.6 按钮按钮按钮(

27、Button)包括按键按钮、单选按钮、复选框和组框四种类型。虽然封装按钮控件的MFC类都是CButton类,但它们具有不同的功能。按键按钮在被按下时会立即执行某个命令;单选按钮用于在一组互相排斥的选项中选择其中一项;复选框用于在一组选项中选择其中一项或多项;组框可以使一组控件关联起来。按钮控件只能发送通知码BN_CLICKED(单击按钮)和BN_DOUBLECLICKED(双击按钮)的WM_COMMAND消息。CButton类提供了一些成员函数实现对按钮控件对象的控制和管理。如利用成员函数GetCheck()或SetCheck()获取或设置单选按钮或复选框的当前状态,利用成员函数GetButt

28、onStyle()或SetButtonStyle()获取或改变按钮控件的风格。按钮控件发送的消息按钮控件发送的消息示例:demo8_88.3.7 8.3.7 列表框列表框列表框(List Box)是一个列出了一些文本项的窗口,常用来显示类型相同的一系列清单,如文件、字体或用户等。与复选框类似,用户可以选择其中一项或多项,但同时列表框中选项的数目和内容可以动态变化,用户可往列表框中添加或删除某些选项。封装列表框控件的MFC类是CListBox类。Windows提供了几个列表类型控件,如列表框、组合框、列表视控件和树视控件。列表框有单选(Single)、多选(Multiple)、扩展多选(Exte

29、nded)和不选(None)四种风格。8.3.8 8.3.8 组合框组合框编辑框和列表框在使用时受到一些限制,编辑框允许用户输入文本内容,但用户却不能直接选择以前已输入的文本内容。列表框可列出各种可能的选项,但用户却不能在列表框中输入新的列表项。而组合框(Combo Box)吸收了列表框和编辑框的优点,它可以显示列表项供用户进行选择,也允许用户输入新的列表项。实质上,组合框是多个控件的组合,包括编辑框、列表框和按钮。组合框有简单的组合框(Simple)、下拉组合框(Dropdown)和下拉列表框(Drop List)三种形式。8.3.9 8.3.9 滚动条滚动条滚动条作为一个独立的控件,其主要

30、作用通过可视化的滚动操作实现程序设计所要求的功能。如滚动显示数据内容、在一个有效范围内选取合适的数值等。滚动条分为垂直滚动条和水平滚动条两种类型。滚动条两端有两个箭头按钮,中间有一个可沿滚动条方向移动的滚动块。当移动滚动条时发送消息WM_HSCROLL或WM_VSCROLL。滚动消息含有通知码,表示用户对滚动条的操作方式。8.4 8.4 公共控件公共控件为了丰富基于MFC的程序开发需要,微软将一些较为流行的控件作为公共控件引入到Windows中,如旋转按钮、进度条、滑块、列表视控件、树视控件、日期时间选取器等。MFC对这些公共控件以类的形式进行了封装。8.4.1 8.4.1 旋转按钮旋转按钮旋

31、转(Spin)按钮控件也称微调控件或上下控件,其形状与滚动条类似,两端也有两个箭头按钮,但中间没有滚动块。用户单击箭头按钮可以增加或减少一个数值,这个值表示旋转按钮滚动位置或另一个与旋转按钮相关联的控件中的数据。当程序需要用户在某个范围内输入一个值时可以使用旋转按钮,其好处是无需担心用户输入一个无效值而导致程序的崩溃。旋转按钮控件经常和一个关联控件(如编辑框)绑定在一起使用。对用户而言,一个旋转按钮和它的关联控件看起来就像一个控件。8.4.2 8.4.2 滑块滑块滑块(Slider)控件也称滑动条或游标控件,它由滑杠、可沿着滑杠方向移动的滑块和可选择刻度的标尺组成。用户可以通过鼠标或键盘移动滑

32、块,滑块不同的位置代表了一个不同的数值。滑块控件比旋转按钮控件更具独立性,一般不需要关联控件。当滑动滑块时,滑块控件将发送滚动消息来通知父窗口,垂直滑块发送消息WM_VSCROLL,水平滑块发送WM_HSCROLL。可调用封装滑块控件的MFC类CSliderCtrl的成员函数设置滑块的最小、最大值、刻度出现的疏密、行和页间距。8.4.3 8.4.3 进度条进度条进度条(Progress)是一个在进行一系列费时操作时显示反馈信息的控件,通过其状态的动态变化告诉用户当前的操作进度。进度条也能表示某个范围内的值,如温度、水平面高度以及音响系统频率的模拟显示。进度条控件有一个“范围”和“当前位置”,范围表示整个操作需要完成的工作量,当前位置表明该操作已完成了多少。进度条控件用于输出,一般不需要进行消息处理。封装进度条控件的MFC类是CProgressCtrl。8.4.4 8.4.4 标签控件和属性表标签控件和属性表标签(Tab)控件也称选项卡控件,它是一个分割称多个页面的窗口,每个页面都配有一个带有标题的标签,单击一个标签就显示对应的页面。

温馨提示

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

评论

0/150

提交评论