第6章创建和使用对话框1第6章创建和使用对话框精讲对话框是一种用户界面,几乎每一个Windows程序都使用对话框与用户进行交互。对话框可能是一个简单的只含有OK按钮的消息框,也可以是一个复杂的数据输入表单。对话框上有一些方便用户输入的控件,对话框依靠这些控件与用户进行交互,其实质是一个接收消息的窗口。在本章节我们主要讲述模式对话框和无模式对话框的原理和使用方法,下一章将详细介绍各种控件的使用。你将学习创建一个对话框,使用对话框模板编辑一个对话框资源,并在程序中调用对话框的方法。6.1对话框的基本原理6.1.1对话框的工作原理在创建一个对话框之前,我们先来了解一下对话框是如何工作的,对话框的数据来自三方面:对话框资源、对话框对象、和一个文档对象:1.对话框资源对话框资源是一个用户输入或取得数据的图形界面。这个图形界面是使用DevelopStudio的对话框编辑器在对话框模板上创建的,程序员可以在对话框模板上增加并编辑控件,生成对话框资源。当应用程序运行时,就可以得到一个对话框。2.对话框对象MFC使用CDialog类来描述对话框,它是CWnd类的派生类。在CWnd类的基础上增加了数据交换的功能。当创建一个新的对话框资源后,使用ClassWizard可以创建一个对话框类的派生类。对话框对象实现了对话框和应用程序之间的通信。在应用程序中定义一个对话框对象后,在对话框显示前,可以通过访问对话框对象的成员变量为一个对话框的控件初始化,在对话框关闭后,可以通过访问对话框对象的成员变量获得用户的输入数据。3.文档对象MFC使用文档对象描述应用程序处理的数据,用户输入的数据要进一步的处理,通常要先存贮到文档对象中。例如:一个学生记录处理的应用程序,用户通过一个对话框输入学生记录并贮存到一个文件中。应用程序的处理顺序是:用户在对话框中输入信息,通过对话框对象得到输入信息,将输入信息整理到文档对象中,使用序列化函数将文档对象存贮到一个文件中,所以文档对象扮演了一个很重要的数据交换的角色。MFC使用以上三者实现用户与应用程序之间数据交换,数据交换流程见图6-1所示,遵循四个步骤。VC++6简明教程2图6-1对话框基本原理6.1.2对话框的类型对话框分为模式对话框和无模式对话框两种。当一个模式对话框打开了,在其关闭之前,用户不能转向其它用户界面对象,只能与该对话框进行交互。我们平时接触到的对话框,大多数都是模式对话框,例如,一个执行菜单命令File-Save后,Save对话框被打开后,用户不能再做其它工作,只能保存完文件或取消保存文件,关闭对话框窗口后,才能做其它工作。无模式对话框恰恰相反,当用户打开一个无模式对话框,对话框停留在屏幕上,仍然允许用户与其它用户界面对象进行交互。无模式对话框最典型的例子是在Word中使用的查找与替换对话框,打开该对话框后,可以交替地进行文档编辑,和查找替换操作。从第一节的介绍可以看到对话框的设计任务主要包括对话框资源模板的设计,对话框类的设计和对话框的运行,绝大多数对话框的创建任务,模式对话框和无模式对话框都是相同的,只有在对话框与应用程序代码的交互中,也就是对话框的运行中,两者有明显的区别。6.2设计对话框资源6.2.1创建对话框使用AppWizard生成的单文档或多文档应用程序,只有一个默认的About对话框,用于显示应用程序版本信息。需要使用对话框模板创建自己的对话框资源。DevelopStudio提供的对话框模板创建了一个基本界面,包括一个OK(确定)按钮和一个Cancel(取消)按钮等。你可以移动、修改、删除这些控件,或者是增加新的控件到对话框模板,构成应用程序所需的对话框资源。创建一个对话框资源到工程的步骤:(1)使用AppWizard生成一个单文档的MFC应用程序Exam6_1。(2)选择Insert-Resource菜单命令。(3)在弹出的InsertResource对话框左边的列表中选择Dialog,单击New按钮。Public:datamemberdocumentxxxxxxxxxxxxxxxxxxxxxxxxxxxx创建对话框模板1数据交换和验证2定义对话框类和3公有成员变量运行对话框,修改4文档对象第6章创建和使用对话框3(4)在项目工作区中选择ResourceView面板,展开Dialog文件夹,可以看到增加了一个对话框资源IDD_DIALOG1,如图6-2所示,双击IDD_DIALOG1,在编辑区出现一个对话框模板。图6-2Exam6_1对话框设计_新建对话框资源6.2.2增加控件一个控件是能够放置在一个对话框中,提供应用程序与用户交互的某种功能。例如,EditBox提供用户文本输入的场所,一组RadioButton提供用户对某一主题的单项选择。MFC将控件设计为对话框窗口的子窗口,控件通过事件通知消息与父窗口联系。在一个对话框资源中增加控件的操作十分方便,只需从图6-2所示的控件工具栏中选中要增加的控件,再将此控件拖拉至对话框模板中的确定位置上,松开鼠标按键即生成一个控件。调整控件的位置和大小的操作与Word中对文本框的操作完全一样。在默认情况下,控件工具栏总是打开的,如果没有打开,可以在DevelopStudio工具栏后的空白处,单击鼠标右键,在弹出的快捷菜单中选择Controls,便可打开控件工具栏。图6-3中列出了VC++6.0中支持的标准控件名称,我们可以很方便地从控件工具栏中生成新的控件,但每一种控件都具有不同的特性,需要学习和掌握。对话框模板对话框资源ID控件工具栏CheckBoxGroupBoxPictureEditControlVerticalScrollBarProgressHotKeyTreeControlAnimateDateTimePickerCustomControlIPAddressExtendedComboBoxComboBoxTabControlMonthCalenderRadioButtonButtonListBoxRichEditListControlSliderSelectionToolStaticTextHorizontalScrollBarSpinVC++6简明教程4图6-3标准控件下面我们试着设计一个可以输入5门功课成绩的输入窗口,在上一节生成的对话框资源IDD_DIALOG1中做以下操作,得到如图6-4所示的对话框:(1)调整对话框模板窗口大小,将OK和Cancel按钮移到窗口的底部。(2)控件工具栏中选中StaticText(静态文本)控件,拖到对话框模板中。(3)通过复制和粘贴操作,生成其它四个StaticText控件。(4)控件工具栏中选中EditBox控件(编辑框),拖到对话框模板中。(5)通过复制和粘贴操作,生成其它四个EditBox控件图6-4EX6对话框设计_增加控件6.2.3设置控件属性一个控件相关的属性设置决定了一个控件可操作行为和显示。例如,控件的ID是控件的一个重要属性,MFC内部是以控件ID来标识一个控件,当消息产生后,是哪一个控件需要进行处理,MFC内部使用的是控件ID。属性的设置是在与每个控件相对应的属性对话框中进行的,单击鼠标右键,在弹出的快捷菜单中选择Properties,打开属性对话框。每一种控件的属性对话框都有所不同,与其特性相关,在下一章我们将详细介绍一些常用控件的属性含义。对上一节的对话框IDD_DIALOG1中的控件作属性设置:(1)鼠标选中第一个StaticText对象,单击鼠标右键,在弹出的快捷菜单中选择Properties,弹出属性对话框,如图6-5所示。第6章创建和使用对话框5图6-5属性对话框设置(2)修改Caption右边的文本框,输入“高等数学”,单击关闭按钮,关闭属性对话框。(3)重复步骤(1)(2),将其它四个Static控件的Caption改为“大学物理”,“大学英语”,“哲学”和“计算机基础”。(4)同样的操作打开5个EditBox控件的属性对话框,修改ID为IDC_SCORE1、IDC_SCORE2、IDC_SCORE3、IDC_SCORE4、IDC_SCORE5。(5)打开按钮OK的属性对话框,修改Caption为“确定”。(6)打开按钮Cancel的属性对话框,修改Caption为“取消”。操作完毕,对话框如图6-6所示。图6-6EX6对话框设计_设置属性同样,对话框的属性设计也是在对话框的属性对话框中设置,在对话框任意空白处单击鼠标右键,在弹出的快捷菜单中选择Properties,如图6-7所示。在Caption中填写“成绩录入”,将成为对话框的标题,单击Font会弹出字体对话框,能设置对话框中显示的字体格式。其它的几个标签页还提供了选项,可以修改对话框窗口的显示样式,可以自己试一试。图6-7对话框属性设置VC++6简明教程66.2.4组织和安排控件当选择了一个对话框资源进入对话框编辑器时,DevelopStudio的菜单栏上会增加一个菜单Layout,如图6-8所示。Layout菜单提供了在对话框模板中合理布置控件的功能菜单项。Align提供了控件的六种对齐方式:左对齐、右对齐、上对齐、下对齐、水平居中、垂直居中。SpaceEvenly提供了两种等间距方式:垂直方向等间距、水平方向等间距。MakeSameSize提供了三种等尺寸方式:宽相等、高相等、两者都相等。ArrangeButton提供了两种组织按键的方式:底部排列、右边排列。CenterinDialog提供了两种居中方式:水平居中、垂直居中。Flip用于水平反方向显示控件及窗口标题。SizetoContent命令根据内容决定控件的大小,例如,按钮的大小由按钮上的显示文本决定。图6-8Layout下拉菜单通过上面几个菜单项的操作能够很方便地齐整控件的摆放位置。现在我们可以整理一下IDD_DIALOG1中摆放凌乱的控件:(1)确定第一个和最后一个StaticText控件的位置,同时选中5个StaticText控件,执行菜单命令Layout-MakeSameSize-width(2)执行菜单命令Layout-Align-Bottom,水平对齐5个控件。(3)执行菜单命令Layout-SpaceEvenly-Across,使5个控件水平等间距。(4)选择“哲学”,执行菜单命令Layout-SizetoContent,微调控件位置(5)确定第一个和最后一个StaticText控件的位置,同时选中5个StaticText控件,执行菜单命令Layout-Align-Bottom和Layout-SpaceEvenly-Across。操作完毕,可以看到控件整齐地排放在对话框模板上,如图6-9所示。图6-9EX6对话框设计_整理控件在Windows环境中通常提供两种操作方法,鼠标操作方式和键盘操作方式,使用鼠标可以直接点击控件进行访问,使用键盘访问控件需要通过Tab键顺次找到某个控件。TabOrder规定了使用Tab键访问第6章创建和使用对话框7控件的顺序,一般TabOrder是控件生成的顺序,执行菜单命令Layout-TabOrder可以显示并修改TabOrder,对IDD_DIALOG1执行菜单命令TabOrder如图6-10所示。图6-10显示TabOrder改变TabOrder的方法既简单又直观,执行了TabOrder命令出现了顺序号之后,按你所想要的访问顺序依次点击每一个控件,完成后,点击空白处就可以了。读者可以试练习将上图的Tab顺序变成先访问第一个EditBox,访问完所有的EditBox后再访问Button。6.2.5测试对话框当构造好一个对话框后,还不能立即在应用程序中运行对话框,MFC提供了Test命令,使程序员在设计阶段就能够测试对话框的运行效果。测试对话框的方法有:(1)菜单命令Layout-Test(2)Dialog工具栏上的Test按钮(3)快捷键Ctrl+T测试对话框IDD_DIALOG1,试着使用文本框输入,并使用Tab键是否符合要求。如图6-11所示。图6-1