《Visual C++面向对象编程教程 第9章 对话框高级编程.ppt》由会员分享,可在线阅读,更多相关《Visual C++面向对象编程教程 第9章 对话框高级编程.ppt(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、版权所有版权所有 复制必究复制必究l模态对话框在关闭之前,不允许用户切换到程序的其它窗口。因为当弹出模态对话框时,它就获得了程序的控制权,并且,模态对话框拥有自己的消息循环,因此其窗口中所有产生的消息都不会送到主窗口的消息循环。l非模态对话框弹出后,用户不需要关闭它就可以在非模态对话框和应用程序其它窗口之间进行切换。常用的Find查找和Replace替换对话框就是非模态对话框。如果关闭非模态对话框的父窗口,非模态对话框一般也自动关闭。9.1 非模态对话框非模态对话框 l对于非模态对话框,使用对话框编辑器创建对话框资源和使用ClassWizard类向导添加对话框类、成员变量和消息处理函数的方法与
2、模态对话框一样,但创建和退出对话框的方式有所不同。l创建模态对话框时是由系统自动分配内存空间,因此在退出对话框时,系统自动调用CDialog:EndDialog()函数来删除对话框。而创建非模态对话框则需要用户来分配内存,退出时还需用户自己删除非模态对话框。非模态对话框的创建非模态对话框的创建l非模态对话框的实例应声明为全局对象,不能象模态对话框那样作为局部对象。一般用new操作符生成,使用结束时用delete操作符将其删除。l区别于模态对话框,非模态对话框用new生成对象后,不是调用CDialog:DoModal()函数,而是调用CDialog:Create()函数装入对话框资源,并创建和显
3、示对话框。lCreate()函数在显示非模态对话框后就立即返回,而DoModal()函数是在模态对话框被关闭之后才返回。并且,由于Create()函数不会启动新的消息循环,非模态对话框与应用程序共用一个消息循环,这样,非模态对话框就不会垄断用户的输入。lWindows将一些常用的对话框集成到操作系统中,作为Windows通用对话框库Commdlg.dll的一部分。用户在程序中可以直接使用这些通用对话框,不必再创建对话框资源和对话框类,减少了大量的编程工作。并且,用户还可以定制通用对话框的外观和性能。l为了在MFC应用程序中使用通用对话框,MFC提供了封装这些通用对话框的类。这些通用对话框类 都
4、 是 从 CCommonDialog类 派 生 而 来,而CCommonDialog类又是CDialog类的派生类。9.2 通用对话框通用对话框通用对话框通用对话框 MFC通用对话框类通用对话框类 CColorDialog CFileDialog CFindReplaceDialog CFontDialog CPagesSetupDialog CPrintDialog COleDialog说说 明明颜色设定对话框,选择不同的颜色文件存取对话框,打开或保存文件查找和替换对话框,查找和替换文本串字体设定对话框,选择不同的字体。页面设置对话框,设置页码、页眉等标准的打印对话框,用于打印和打印设置该类
5、及其派生类用于生成OLE对话框9.3 公共控件公共控件 l在Window 95推出之前,只提供了静态文本、按钮、编辑框、列表框和组合框等标准控件。在推出Window 95时,将其中一些较为流行的控件作为公共控件引入到Windows中,如旋转按钮、进度条、滑块、列表视控件、树视控件、日期时间选取器等公共控件。l标准控件保存在System目录下的User.exe文件中,公共控件保存在System目录下的Comctl32.dll中文件。MFC对这些公共控件以类的形式进行了封装,如CProgressCtrl、CListCtrl和CTreeCtrl等。9.3.1 旋转按钮旋转按钮l旋旋转转(Spin)按
6、钮控件也称微调控件或上下控件,其形状与滚动条类似,两端也有两个箭头按钮,但中间没有滚动块。用户单击箭头按钮可以增加或减少一个数值,这个值表示旋转按钮滚动位置或另一个与旋转按钮相关联的控件中的数据。l当程序需要用户在某个范围内输入一个值时可以使用旋转按钮,其好处是无需当心用户输入一个无效值而导致程序的崩溃。l旋转按钮控件经常和一个关联控件(如编辑框)绑定在一起使用,用户只需用鼠标单击旋转按钮控件的上下箭头,就能设置关联控件中的数据内容。对用户而言,一个旋转按钮和它的关联控件看起来就象一个控件。关联控件的设置:关联控件的设置:l可以在程序中通过调用成员函数设置关联控件,但常用的方法是通过控件Pro
7、perties对话框直接设置关联控件。l在Alignment下拉框设置旋转按钮与关联控件的位置关系,Right和Lift分别表示旋转按钮紧靠在关联控件窗口的右内侧或左内侧,Unattached表示旋转按钮的位置与关联控件无关;属性Auto buddy表示旋转按钮把它前一个控件(按TabOrder顺序)作为关联控件;属性Set buddy integer表示单击旋转按钮改变位置时,关联控件窗口能自动显示这个位置值。旋转按钮的属性和操作:旋转按钮的属性和操作:l在控件Properties属性对话框的Orientation下拉框中设置垂直(Vertical)或水平(Horizontal)方向两种风格
8、;Wrapt表示当旋转按钮达到最大(最小)值时重新回绕到最小(最大)值;No thousands表示取消显示数值中的千分位分隔符;Arrow keys表示可以使用键盘“”和“”键改变控件位置值。l对 旋 转 按 钮 的 操 作 通 过 调 用 MFC类CSpinButtonCtrl的成员函数来完成,主要成员函数有:SetRange()和GetRange()用于设置或获得旋转按钮的上下限范围,SetPos()和GetPos()用于设置或获得旋转按钮的当前位置值,函数SetBuddy()用于动态设置关联控件,函数GetBuddy()用于获得关联控件窗口的指针。例例 编写一个单文档应用程序ExmpC
9、omctl,执行“测试控件|公共控件”菜单命令打开一个对话框,对话框有一个带旋转按钮的编辑框,用于输入圆周线的宽度。单击旋转按钮,在编辑框显示旋转按钮所表示的线宽。单击OK按钮,程序根据线宽在用户视图区画一个圆。9.3.2 滑块滑块l滑滑块块(Slider)控件也称滑动条或游标控件,它由滑杠、可沿着滑杠方向移动的滑块和可选择刻度的标尺组成。用户可以通过鼠标或键盘移动滑块,滑块不同的位置代表了一个不同的数值。l与滚动条相比,滑块控件中间只有一个滑块,两端箭头按钮。与旋转按钮相比,滑块控件比旋转按钮控件更具独立性,一般不需要关联控件。l滑块控件的属性:Orientation下拉框设置滑块控件的垂直
10、(Vertical)或水平(Horizontal)方向风格。Point设置刻度标尺的位置,Both表示滑块是一个矩形块,Top/Left表示标尺位于滑杆的左边或上方,Bottom/Right表示标尺位于滑杆的右边或下方。滑块控件发送的消息和操作:滑块控件发送的消息和操作:l当滑动滑块时,滑块控件将发送滚动消息来通知父窗口,垂直滑块发送消息WM_VSCROLL,水平滑块发送WM_HSCROLL。l可调用封装滑块控件的MFC类CSliderCtrl的成员函数设置滑块的最小、最大值、刻度出现的疏密、行 和 页 间 距。如:GetLineSize()、SetLineSize()、GetPageSize
11、()、SetPageSize()、GetRange()、Set-Range()、GetPos()、SetPos()等。例例 完善例7-10a中的应用程序ExmpComctl,向对话框资源添加一个滑块控件,用于设置圆的半径。在对话框中单击OK按钮,程序根据设置的线宽和半径在用户视图区画一个圆。9.3.3 进度条进度条l进进度度条条(Progress)是一个在进行一系列费时操作时显示反馈信息的控件,通过其状态的动态变化告诉用户当前的操作进度。进度条也能表示某个范围内的值,如温度、水平面高度以及音响系统频率的模拟显示。l形状上看,进度条由一个细长的矩形窗口和一些填充块组成,其中的填充块越多,表示任务
12、越接近于完成,当蓝色块填满时,任务也就完成了。l我们一般使用进度条的默认属性,其常用的属性有:Border表示进度条有一个边框;Vertical表示垂直进度条;Smooth表示使用不间断的蓝色条填充控件窗口。进度条控件的操作:进度条控件的操作:l进度条控件也有一个“范围”和“当前位置”,范围表示整个操作需要完成的工作量,当前位置表明该操作已完成了多少。初始化时只需设置进度条值的范围、当前值和使用步长。l进度条控件用于输出,一般不需要进行消息处理。l为了设置和获得进度条有关参数,需要调用封装进度条控件MFC类CProgressCtrl的有关成员函数。函数SetRange()或GetRange()
13、用于设置或获取控件值的范围,函数SetPos()和GetPos()用于设置或获取控件的当前位置,函数SetStep()用于设置步长,函数StepIt()用于在控件窗口填充一个蓝色块。例例 编写一个单文档应用程序PrgresAnmt,执行“测试控件|进度条和动画”菜单命令时在用户视图区播放一段动画,并用进度条提示动画播放的进程。9.3.4 标签控件和属性表标签控件和属性表1.标签(标签(Tab)控件控件l标签(Tab)控件也称选项卡控件,它是一个分割成多个页面的窗口,每个页面都配有一个带有标题的标签,单击一个标签就显示对应的页面。l标签控件在功能上等价一系列对话框窗口,但使用起来更接近于我们的使
14、用习惯。编程时使用标签控件,可以在一个窗口的相同区域内定义多个页面,其中每个页面(可以是一个对话框)上包括一些不同的控件,以实现不同的对话功能。l标签作为控件使用,它不是对话框,编程时不能直接在各个标签页上添加控件,只能在选中不同标签时在相同位置显示含有不同控件的对话框。标签控件的属性和消息:标签控件的属性和消息:l标签控件的属性有:Alignment下列框用于设置每个标签的宽度为自动随标题长度调节(Right Justify)或固定宽度(Fixed Width0,Buttons表示标签采用按钮形状,Multiline表示标签可以多行的形式显示,Bottom表示标签位于控件的底端,Vertic
15、al表示标签以垂直的方式出现。l标签控件消息:单击标签时发送消息NM_CLICK。选择不同标签时发送消息TCN_SELCHANGING(标签切换前)或TCN_SELCHANGE(标签切换后)。封装标签控件的封装标签控件的MFC类:类:lMFC类CTabCtrl提供了标签控件的各项服务功能,通过其成员函数实现了对控件及其数据结构进行操作的方法。编程时常用的成员函数有:函数InsertItem()或 DeleteItem()用 于 插 入 或 删 除 一 个 标 签,函 数 GetCurlSel()或SetCurSel()用于获取所选择标签的索引号或设置当前标签。l在 CTabCtrl类 的 很
16、多 成 员 函 数 中 都 用 到 一 个TCITEM结构(取代了TC_ITEM结构)的参数,该结构用于设置每一个标签的属性,例例 编写一个单文档应用程序ExmpTabCtl,执行“测试控件|标签控件”菜单命令打开一个标签对话框,对话框有2个标签页面,在每个页面分别显示“组合框”和“公共控件”对话框,并完成与前面例题要求相同的程序功能。2.属性表(属性表(Property sheet)l属属性性表表(Property sheet)又称属性对话框,其形式和功能都类似于前面介绍的标签对话框。一个属 性 表 由 一 个 CPropertySheet类 对 象 和 多 个CPropertyPage类对
17、象构成,CPropertySheet类或其派生类对象代表一个属性表,CPropertyPage派生类对象代表每个不同的属性页。l虽然CPropertySheet派生于CWnd,但属性表的使用方法与CDialog类似,即先调用构造函数创建属性表,然后调用CPropertySheet:AddPage()函数将属 性 页 加 入 属 性 表 中,最 后 调 用 CPropertySheet:DoModal()创建一个模态属性表,或调用CPropertySheet:Create()函数创建非模态属性表。l一个属性页对应一个对话框,用于进行数据的输入和输出。CPropertyPage类派生于CDialo
18、g类,因此,每个属性页实际上就是一个对话框。我们可以利用对话框编辑器为每个属性页添加控件,并可利用ClassWizard创建自己的派生类,添加与控件关联的成员变量和消息处理函数。例例 利用属性表实现与前例相同的功能。9.3.5 图像列表图像列表l图图像像列列表表(Image list)是一个由一些大小相同的图像(如图标或位图)组成的集合,如图所示。图像列表本身只是一种存储结构,这种存储结构与数组极为相似,存储在图像列表中的每个图像通过一个索引值识别。l图像列表不是控件,没有对应的控件窗口,我们不能直接看见它,但可利用MFC图像列表类或图像列表的关联控件来显示图像列表中的图像。封装图像列表的封装
19、图像列表的MFC类:类:l图像列表由MFC类CImageList支持。CImageList类提供了创建、显示和管理图像列表的方法,调用CImageList类的成员函数Create()创建图像列表,调用函数Add()或Remove()向图像列表中添加或删除一个图像,调用函数GetImageCount()获得图像列表中图像个数,调用函数Draw()绘制图像。l编程时可以直接使用图像列表,但图像列表最主要的用途还是作为与其相关联控件的显示项的图形标志,如图片控件、列表视控件、树视控件、扩展组合框、标签控件和属性页等。例例 编写一个单文档应用程序,利用图像列表在视图区显示一系列位图。9.3.6 列表视
20、控件列表视控件 l列列表表视视(List view)控件也称列表控件,在需要以报表形式显示数据时,列表视控件是最好的选择。区别于列表框,列表视控件可显示由多个子项组成的项目,并允许以多种方式显示信息。列表视控件还可以为显示的项目增加一个图标,但代表项目的图标必须存储在一个图像列表中。l列表视控件包含一个项目列表,而其中每一个项目由图标、项目名称(主项)和多个子项组成,每个项目所包含子项的数目必须相同,属性相同的每个子项显示在同一列中。列表视控件有两个重要的数据结构LVCOLUMN和LVITEM。列表视控件的属性:列表视控件的属性:列表视控件的属性一般使用其默认值,其常用的属性有:View指定程
21、序运行后列表视控件最初显示的方式,可设置为Icon(大图标)、Small Icon(小图标)、List(列表)或Report(报表);Single selection 表示每次只能选中一个项;Auto arrange使得项目在Icon和Small Icon显示方式下能够自动排列整齐;Edit Labels表示可以编辑项目的卷标,即主项(第0列)的文本,这时需要添加控件通知消息LVN_ENDLABELEDIT的处理函数;No column header取消控件所有列的标题。列表视控件的操作列表视控件的操作:列表视控件有多种显示形式,其细节由控件本身实现的。MFC提供了CListCtrl类用于实现
22、列表视控件的各种功能,如对项目进行添加、删除、修改和检索等。主要成员函数:InsertItem()或DeleteItem()插入或删除一个主项,GetItemText()或SetItemText()获得或添加子项文本;GetItemCount()获取项目的总 数(行 数);FindItem()查 找 具 有 某 些 特 征 的 项 目;GetNextItem()查找并返回某些项目的索引,常用于查找当前选择的项目;SetImageList()把图像列表与列表视控件关联;InsertColumn()或DeleteColumn()插入或删除一个列。例例 编写对话框应用程序MyList,对话框中有一个
23、列表视控件、一个列表框和其它一些控件。列表视控件显示一些由图标、名称、人口和面积组成的项目,列表框列出了大图标、小图标、列表和报表四种显示方式。选中列表框中的显示方式时,列表视控件窗口以指定方式显示其中的项目。单击列表视控件中的一个项目时,在三个编辑框分别显示该项目的数据。单击“添加”或“删除”按钮将添加或删除一个项目。9.3.7 树视控件树视控件l树树视视(Tree view)控件也称树控件,用于表示有层次关系的事物或能够进行分类划分的对象。l树视图控件中每个项目由项目名称和一个可选择的图标组成,项目分为父项目和子项目,一个父项目拥有一个子项目列表,双击父项目可以展开或折叠其中的子项目。父项
24、目位于子项目的上一层,子项目又可以是低一层子项目的父项目。l树视控件编程时常用到的数据结构:TVITEM结构和TVINSERTSTRCT结构。TVITEM结构用于定义项目,TVINSERTSTRCT结构用于定义插入项,该结构含有一个TVITEM结构成员。树视控件的属性:树视控件的属性:使用树视控件时经常需要重新设置它有关属性,树视控件常用的属性有:Has buttons表示父项目的前面有一个“+”或“-”按钮,单击该按钮可以展开或折叠该项目;Has lines表示用连线表示项目之间的层次关系;Lines at root表示在项目的最高层用连线将项目与根项目连接;Edit labels表示可以编
25、辑项目的名称;Check boxes表示项目的左侧有一个复选框;Single expand表示单击项目可以展开或折叠该项目。树视控件的操作树视控件的操作:封装树视控件的MFC类是CTreeCtrl类,CTreeCtrl的成员函数有:SetImageList()设置与树视控件关联的图像列表;GetCount()返回控件中项目的数量;GetSelectedItem()返回当前选中的项目;GetNextItem()获得满足某种条件的项目;GetChildItem()或GetParentItem()返回一个项目 的 子 项 目 或 父 项 目;GetNextSiblingItem()或 GetPrevSiblingItem()返回下一个或上一个兄弟项;GetRootItem()返回根项目;GetItemText()或SetItemText()用于获取或设置项目的文本串;GetItemData()或SetItemData()获得或设置项目的关联数据;InsertItem()插入一个项目;DeleteItem()删除一个项目;DeleteAllItem()删除所有项目;Expand()展开或者折叠项目。例例 编写一个对话框应用程序MyTree,对话框中有一个树视控件和其它一些如图所示的按钮。树视控件用于显示一些有层次关系的项目,用户可通过“添加”或“删除”按钮向树视控件中添加或删除一个项目
限制150内