第2章 对话框.docx
《第2章 对话框.docx》由会员分享,可在线阅读,更多相关《第2章 对话框.docx(37页珍藏版)》请在冰豆网上搜索。
第2章对话框
第2章对话框
对话框是Windows应用程序中最重要的用户界面元素之一,是与用户交互的重要手段,对话框是一个特殊类型的窗口,可以作为各种控件(具有独特功能的界面元素)的容器,可用于捕捉和处理用户的多个输入信息或数据。
虽然对话框的创建、使用和实现比较容易,但同时也反映了开发者对界面设计的视觉艺术水平。
2.1创建对话框
在VisualC++6.0应用程序中,创建一个对话框可以有两种情形:
一是直接创建一个基于对话框的应用程序,二是在一个应用程序中添加对话框类。
2.1.1创建对话框应用程序
用MFCAppWizard(MFC应用程序向导)可以非常方便地创建一个基于对话框的应用程序,如创建过程如下:
启动VisualC++6.0,选择File|New菜单命令,在弹出的对话框中选择Projects选项卡,再选择MFCAppWizard[exe]的项目类型。
在Location栏给出应用程序的文件夹的位置,在Projectname栏给出应用程序名。
单击OK按纽,进入下一步。
从弹出的对话框中,选择Dialogbased。
按Finish按纽,出现一个信息对话框,显示出用户在前面几个步骤中做出的选择信息,单出OK按纽,系统开始创建,并又回到VisualC++6.0的主界面,同时还自动打开对话框模板编辑器以及控件工具栏、控件布局工具栏等。
【例2.1】创建一个名为Password的对话框应用程序,用一个对话框来实现口令输入。
制作步骤如下:
1创建基于对话框的应用程序
(1)点击菜单项File|New,选Projects标签下的MFCAppWizard[exe],取名Password,按OK按纽。
在下一个对话框中,选“Dialogbased”,按FInish按纽。
(2)点击菜单项Insert|Resource,选Dialog,再按New按纽,创建一个新对话框。
用鼠标选中对话框,按回车键,在对话框弹出的属性对话框中,将原ID号由IDD_DIALOG1改为IDD_PASSWORD_DIALOG,将原Caption“dialog”改为“口令”。
点出Font,选“宋体,9号”,按回车键。
(3)在对话框模板添加如下控件,其控件属性按下表设置,其界面依下图布局。
控件
ID号
属性
标题
静态文本1
IDC_STATIC
缺省
请输入口令
静态文本2
IDC_STATIC
center
口令为一个0至9999之间的整数
编辑框
IDC_PASSWORD_EDIT
缺省
缺省
按纽1
IDOK
缺省
确定
按纽2
IDCANCEL
缺省
取消
2.完善CPasswordDlg类代码
(1)创建对话框类。
打开IDD_PASSWORD_DIALOG对话框模板,按Ctrl+W进入ClassWizard。
ClassWizard会发现IDD_PASSWORD_DIALOG是一个新的对话框模板,于是会询问是否要为IDD_PASSWORD_DIALOG创建一个对话框类。
单击OK按纽确认。
在CreateNewClass对话框中,在Name栏中输入CPasswordDlg,在Baseclass栏中选择CDialog,在DialogID栏中选择IDD_PASSWORD_DIALOG。
单击OK按纽后,对话框类CPasswordDlg即被创建。
(2)添加与控件关联的对话框类成员变量。
按Ctrl+W进入ClassWizard,选MemberVariables标签,然后在Classname栏中选择CPasswordDlg。
这时,在下面的变量列表中会出现对话框控件的IDs。
双击列表中的IDC_PASSWORD_EDIT弹出AddMemberVariable对话框,在Membervariablename栏中输入m_nPassword,在Category栏中选择Value,在Variabletype栏中选择int。
按OK按纽后,数据变量m_nPassword就会被加入到变量列表中。
将m_nPassword的值限制在0到9999之间。
方法是先选择m_nPassword,然后在ClassWizard对话框的左下角输入最小和最大值。
有了这个限制后,对话框会对输入的值进行有效性检查,若输入的值不在限制范围内,则对话框会提示用户输入有效的值。
(3)对话框的初始化。
选择ClassView卡片,选类CPasswordDlg,展开它并双击它的构造函数CPasswordDlg(),添加以下代码:
CPasswordDlg:
:
CPasswordDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CPasswordDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CPasswordDialog)
m_Password=0;
//}}AFX_DATA_INIT
}
需要说明的是,一般对话框中的控件初始化在消息的处理函数OnInitDialog中进行。
因为处理函数OnInitDialog对应WM_INITDIALOG消息,当收到此消息时,对话框已初步创建,对话框的窗口句柄也已有效,但对话框还未被显示出来。
因此,可以在OnInitDialog中做一些影响对话框外观的初始化工作。
(4)为显示对话框,在文件Password.cpp中,加入以下语句
#include”PasswordDlg.h”
并对InitInstance()函数添加如下代码:
BOOLCPasswordApp:
:
InitInstance()
{
…
//Theoneandonlywindowhasbeeninitialized,soshowandupdateit.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
CPasswordDlgcDlg;//声明CPasswordDlg类的一个对象
if(cDlg.DoModal()==IDOK)//用户按了确定按纽
{
if(cDlg.m_nPassword!
=2012)//口令设置为2012
{
//如果口令不对,则显示出错信息,然后程序结束
AfxMessageBox("口令错误,确定后将退出程序");
returnFALSE;
}
}
else
returnFALSE;
returnTRUE;
}
(5)编译以及运行结果如下:
2.1.2在应用程序中添加并创建对话框
实际应用中,常常需要在一个应用程序中添加并使用一个对话框。
这里以一个单文档应用程序为例,来说明添加并创建对话框的过程。
主要包括添加对话框资源和创建对话框这两个步骤。
下面,通过一个例子,介绍详细如何在应用程序中添加对话框。
【例2.2】创建名为Mydialog单文档应用程序,为它添加一个对话框,并实现该对话框的显示。
1.创建默认的单文档应用程序
启动VisualC++6.0,选择File|New,在Projects选项卡下选MFCWizard[exe],取应用程序名为Mydialog,按OK。
在下一个对话框中,选Singledocument,按Finish。
2.资源和资源标识
VisualC++6.0将Windows应用程序中经常用到的菜单、工具栏、对话框、图标等都视为“资源”,并将其单独存放在一个资源文件中,每个资源都有相应的标识符来表示区分,并且可以像变量一样进行赋值。
将项目工作区切换到ResourceView选项卡,展开所有结点,如下图所示。
可以看出,VisualC++6.0使用的资源可分为以下几类:
●快捷键列表(Accelerator):
一系列组合键的集合,被应用程序用来引发一个动作,该列表一般与菜单命令相关联,用来代替鼠标操作。
●对话框(Dialog):
含有按纽、列表框、编辑框等各种控件的窗口。
●图标(Icon):
代表应用程序显示在Windows桌面上的位图,这同时有32×32像素和16×16像素两种规格。
●菜单(Menu):
用户通过菜单可以完成应用程序的大部分操作。
●字符串表(StringTable):
应用程序使用全局字符串或其他标识符。
●工具栏按纽(Toolbar):
工具栏外观是以一系列具有相同尺寸的位图组成的,它通常与一些菜单命令项相对应,用以提高用户的工作效率。
●版本信息(Version):
包含应用程序的版本,用户注册码等相关信息。
除以上述常用资源类别外,还有鼠标指针、HTML等,甚至可以自己添加新的资源类别。
每一个资源类别下都有一个或多个相关资源,每一个资源是由标识符来定义的。
当添加或创建一个新的资源或资源对象时,系统会为其提供默认的名称,如IDR_MAINFRAME等。
当然,用户也可重新命名,但要按一定的规则来进行,因为这样便于在应用程序代码设计时理解和记忆。
一般地,要遵循下列规则:
(1)在标识符名称中允许使用字母a~z、A~Z、0~9以及下划线。
(2)标识符名称不区分大小字母,如new_idd与NEW_Idd是相同的标识符。
(3)不能以数字开头,如8BIT是不合法的标识符名。
(4)字符个数不得超过247个。
事实上,每一个定义的标识符都保存在应用程序项目的Resource.h文件中,它的取值范围为0~32767。
在同一个项目中,资源标识符名称不能相同,不同的标识符的值也不能一样。
3.添加对话框资源
(1)选择Insert|Resource菜单命令,或按Ctrl+R键打开“插入资源”对话框。
(2)选Dialog项,按New按纽,可插入一个标识符为IDD_DIALOG1的新对话框。
(3)利用对话框编辑器,可以在对话框模板上安置控件,并对控件进行属性设置。
将鼠标点击对话框空白处,按Enter键(回车键)。
将ID改为IDD_DIALOG_MYDIALOG,将Caption改为“我的对话框”,按Font,选“宋体,9号”。
再按回车键。
4.创建对话框类
(1)在应用程序中使用添加的对话框前,必须先为该对话框模板创建一个用户对话框类。
在对话框模板的空白区域内双击,将弹出一个创建一个对话框资源的新类的对话框。
(2)在name框输入用户定义的类名CMydialogDlg。
注意要以C字母打头,以保持与VisualC++标识符命名规则一致。
其余的均采用缺省值。
2.2设计对话框
作为一种常见的窗口界面,对话框的重点内容是外观设计与属性设置。
2.2.1设置对话框属性
在对话框模板的空白处右击,从弹出的快捷菜单中选择“Properties”(属性)命令,打开对话框属性设置。
从图中可以看出,对话框属性有五个选项卡:
General(常规)、Style(样式)、MoreStyle(更多样式)、ExtendedStyle(扩展样式)、MoreExtendedStyle(更多扩展样式)。
下面,只介绍最常用的常规属性,如下表所示。
表2.1对话框常规属性
项目
说明
ID
修改或选择对话框的标识符名称
Caption
输入对话框的标题名称,中英文均可
Font
设置字体的种类(如宋体)、尺寸(如9号)
XPos/YPos
对话框左上角在父窗口中的X、Y坐标,都为0时表示居中
Menu
默认值无,当对话框需要菜单时输入或选择指定的菜单资源
Classname
默认值无,它提供C++编程时所需要的类名,对MFC类库的资源文件来说,该项不被激活
说明:
(1)在ID框中,可修改对话框默认的标识符IDD_DIALOG1;在标题框中,可对默认标题Dialog进行修改。
(2)单击Font按纽,通过弹出的字体对话框将文本设置成“宋体,9号”,以便使自己设计的对话框和Windows中的对话框保持外观上的一致。
2.2.2添加和布局控件
一旦对话框资源被打开或被创建,就会出现对话框编辑器,通过它可以在对话框中进行控件的添加和布局等操作。
1.控件的添加
对话框编辑器一旦打开,“控件”工具栏一般都会随之出现。
若不出现,则可在开发环境的工具栏区的空白处右击,从弹出的快捷菜单中选择“控件”菜单项。
利用“控件”工具栏中的各个按纽可以顺利完成控件的添加。
下图说明了各个按纽所对应的控件类型。
向对话框添加一个控件的方法有下列几种:
(1)在控件工具栏中单击某控件,此时的鼠标箭头在对话框内变成“+”字形状;在对话框指定位置单击,则此控件被添加到对话框的相应位置,再拖动刚添加控件的选择框可改变其大小和位置。
(2)在控件工具栏中单击某控件,此时鼠标箭头在对话框内变成“+”字形状;在指定位置处按住鼠标左键不放,拖动鼠标至满意位置,释放鼠标键。
(3)用鼠标左键点中控件工具栏中的某控件,并按住鼠标左键不放;在移动鼠标到对话框的指定位置的过程中,用户会看到一个虚线框,下面带有该控件的标记;释放鼠标左键,新添加的控件立即出现在对话框中。
2.控件的选取
控件的删除、复制和布局操作一般都要先选取控件伯,若选取单个控件,则可使用下列方法:
(1)用鼠标直接选取。
在控件工具栏中选取“选择按纽”,然后移动鼠标指针至指定控件上,单击即可。
(2)用助词符来选取。
如果控件的标题中带有下划线的字符,这个字符就是助记符,选择时直接按下该助记符键或“Alt+助记符”键即可。
(3)用Tab键选取。
在对话框编辑器中,系统会根据控件的添加次序自动设置相应的Tab键次序(按Ctrl+D可以看到其次序)。
利用Tab键,用户可在对话框内的控件中进行选择。
每按一次Tab键依次选取对话框中的下一个控件,若按住Shift键,再单击Tab键则选取上一个控件。
对于多个控件的选取,可采用下列方法:
(1)先在对话框内按住鼠标左键不放,拖出一个大的虚框,然后释放鼠标,则该虚框所包围的控件都被选取。
(2)先按住Shift键不放,然后用鼠标选取控件,直到所需要的多个控件选取之后再释放Shift键。
若在选取时,对已选取的控件再选取一次,则取消该控件选取。
3.控件的删除、复制和布局
当单个控件或多个控件被选取后,按方向键或用鼠标拖动控件的选择框可移动控件。
若在鼠标拖动过程中还按住Ctrl键则复制控件。
若按Del键可将选取的控件删除。
当然还有其他一些编辑操作,但这些操作方法和一般的文档编辑器基本相同。
对于控件的布局,对话框编辑器中提供了控件布局工具栏。
如下图所示,它可以自动地排列对话框内的控件,并能改变控件的大小。
4.测试对话框
选Layout|Test菜单命令、按Ctrl+T或按布局工具栏中最左端按纽,可模拟所编辑的对话框的运行情况,帮助用户检验对话框是否符合用户要求以及控件功能是否有效等。
2.2.3分组和刻蚀线
在对话框中,常常需要将同一类别的控件组用“框线”来分隔,这时需要用到“组框”控件和静态图片控件。
1.组框
组框(GroupBox)是一种静态控件,它使用具有刻蚀效果的矩形框线来细分对话框界面,其常规(General)属性如下图所示,其含义如下:
(1)ID((identification)是控件的标识符,每种控件都有默认的ID号,所有静控件均默认为IDC_STATIC。
(2)Caption(标题)用来指示控件的标题内容或说明等,当作为矩形框线时,常将此控件的标题内容清空。
(3)Group(组)用来指定控件组中的第一个控件,如果该项未被选中,则此控件后的所有控件均被看作同一组。
成组的目的是让用户用键盘方向键在同一组控件中进行切换。
(4)HelpID(帮助ID)用来指定是否为该控件建立一个上下文相关的帮助标识符。
(5)Visible(可见)用来指定创建的控件是否可见。
(6)Disabled(已禁用)用来指定控件初始化是否被禁用。
(7)Tabstop(制表站)用来指定是否允许用户使用Tab键来选择控件。
2.刻蚀线
当对话框界面无需太多的细分时,常使用一条水平和竖直的刻蚀线来分隔。
此时,应需要使用“图片”(Picture)控件来构成。
与“组框”控件相似,“图片”控件也属于静态控件,其常规属性如下图所示。
若将“类型”选择为默认的“框架”(Frame)类型,而将“颜色”类型选为“蚀刻”(Etched),然后关闭属性对话框。
此时,静态图片控件变成一个蚀刻的矩形框。
改变控件的大小可使其变成一条水平线或竖直线,这就是静态图片框的妙用。
2.2.4WM_INITDIALOG消息
对话框向其父窗口发送消息,需要通过WM_INITDIALOG消息,它是在创建应用程序Mydialog的对话框类CMydialogDlg时,由VisualC++自动生成的。
但它需要与名为OnInitDialog函数的关联,系统在对话框显示之前就会调用此函数,因此常将对话框一些初始化代码添加到这个函数中。
在工作区选ClassView选项卡,选CMydialogDlg类,按Ctrl+W,打开ClassWizard,选取MessageMaps选项卡。
在Project选MyDialog,在Classname选CMydialogDlg,在ObjectIDs选CMydialogDlg,在Messages选WM_INITDIALOG,按AddFunction按纽,再按EditCode按纽,进入OnInitDialog()的编辑窗口,手动地为其添加一系列初始化代码。
BOOLCMydialogDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//TODO:
Addextrainitializationhere
…
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
}
2.3使用对话框
当在项目中添加对话框资源并创建对话框类,便可在应用程序使用该对话框。
使用时,通常是先在应用程序中添加该对话框类的包含头文件,然后定义该类的对象,通过对象来调用类的成员函数DoModal来模式显示,或通过对象指针来创建对话框。
2.3.1在程序中使用
在程序中使用时常常将显示对话框的代码添加到命令消息的映射函数中,由于单文档应用程序包含菜单的用户界面,因而通常将代码添加到菜单命令消息的映射函数中,例如下面的过程(仍以上面的MyDialog项目为例):
(1)将项目工作区窗口切换到ResourceView选项卡,展开所有结点,双击资源Menu项中的IDR_MAINFRAME,将打开菜单编辑器,相应的MyDialog项目的菜单资源被显示出来,在菜单的最后一项,留出了一个菜单项的空位置,用来输入新的菜单项。
需要说明的是,文档程序中的菜单通常是多级联动的,即最上面的水平菜单为顶层菜单,每项菜单项都可有一个弹出式的子菜单。
由于顶层菜单项的子菜单是向下展开的,因而其子菜单又称为下拉菜单。
(2)在菜单的空位置上双击,则出现它的属性对话框,在标题框中输入“对话框(&D)”,结果如图所示,其中符号&用来将其后面的字符D作为该菜单项的助记符,这样当按住Alt键不放,再按该助记符键D时,对应的菜单项就会被选中,或在菜单打开时,直接按相应的助记符键D,对应的菜单项也会被选中。
(3)单击菜单属性对话框中“保存可见”(KeepVisible)按纽,使此属性对话框一直可见,以方便操作。
单击“对话框”菜单项下方的空位置,在属性对话框中,在“标题”文体框中输入“第一个对话框(&F)”,在ID框输入该菜单项的资源标识ID_DLG_FIRST,结果如图所示,单击属性对话框右上角的“关闭”按纽。
这样,就将子菜单项“第一个对话框(&F)”用ID_DLG_FIRST来标识。
需要说明的是,当菜单项的属性中选中“弹出”(Pop_up)时,表示该菜单项是含有下拉子菜单的项层菜单项,其对话框中ID、“分隔符”(Separator)和“提示”(Prompt)选项此时均无效。
表2.2列出了“菜单项目属性”对话框中“常规”(General)选项卡的各项含义。
表2.2常规属性的各项含义
项目
含义
ID
菜单的资源ID号
标题(Caption)
用来标识菜单项显示文本,助记符字母的前面须有一个&符号,这个字母与Alt构成组合键
分隔符(Separator)
选中时,菜单项是一个分隔符或是一条水平线
已复选(Checked)
选中时,菜单项文本前显示一个选中标记
弹出(Pop_up)
选中时,菜单项含有一个弹出式子菜单
已变灰(Grayed)
选中时,菜单项显示是灰色的,用户不能选用
非活动(Inactived)
选中时,菜单项没有被激活,用户不能选用
帮助(Help)
选中时,菜单项在程序运行时被放在顶层菜单的最右端
中断(Break)
略
提示(Prompt)
用来指明光标移至该菜单项时在状态栏上显示的提示信息
(4)用鼠标将新添加的菜单项拖放到“查看”和“帮助”菜单项之间。
(5)按Ctrl+W,弹出MFCAppWizard对话框,该对话框自动切换到MessageMaps页面。
从Classname组合框中选择CMydialogView,在ObjectIDs列表框中选择ID_IDG_FIRST,然后在Messages框中选中并双击COMMAND消息。
(6)出现AddMemberFunction对话框,从中可以输入函数名称,系统默认的函数名为OnDlgFirst。
该成员函数是对菜单项ID_DLG_FIRST的映射,也就是说,当应用程序运行时,用户选择“对话框|第一个对话框”菜单项时,则在CMydialogView类中映射函数OnDlgFirst被调用,执行函数中的代码。
单击OK按纽,再单击EditCode按纽,添加以下代码:
voidCMydialogView:
:
OnDlgFirst()
{
//TODO:
Addyourcommandhandlercodehere
CMydialogDlgdlg;
dlg.DoModal();
}
代码中,DoModal是CDialog基类成员函数,它用来显示和终止模式对话框。
(8)在CMyDialogView类的实现文件MyDialogView.cpp的前面,添加CMydialogDlg类的头文件包含。
#include“stdafx.h”
//…
#include“MydialogView.h”
#include“MydialogDlg.h”
(9)编译并运行,在应用程序菜单中,选择“对话框|第一个对话框”菜单项,将出现如下图所示的对话框,这就是前面添加的对话框。
2.3.2DoModal和模式对话框
所谓“模式对话框”是指当对话框被弹出,用户必须在对话框中作出相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。
一般情况下,模式对话框会有OK(确定)和Cance(取消)按纽。
单击OK按纽,系统认定用户在对话框中的选择或输入有效,对话框退出;单击Cancel按纽,对话框中的选择或输入无效,退出对话框,程序恢复原有状态。
模式对话框的应用范围较广,上面示例中使用的对话框和平时所见到的大多数对话框都是模式对话框。