目录
前言
一、对话框
1.1 对话框概述
1.1.1 对话框的类型
1.1.2 对话框的CDialog类
1.1.3 对话框的组成
1.2 模态对话框
1.2.1 设计对话框模板资源
1.2.2 设计对话框类
1.2.3 运行对话框
1.2.4 对话框数据交换和校验机制
1.3 非模态对话框
1.3.1 非模态对话框的特点
1.4 属性页对话框
1.5 通用对话框
1.5.1 CFileDialog类
1.5.2 CColorDialog类
1.5.3 CFontDialog类
1.5.4 CPrintDialog类和CPageSetupDialog类
1.5.5 CFindReplaceDialog类
总结
前言
本篇文章介绍对话框
一、对话框
1.1 对话框概述
1.1.1 对话框的类型
主要有以下两种:
- 模式(Model)对话框
- 无模式(Modeless)对话框
1.1.2 对话框的CDialog类
CDialog类从CWnd类派生而来,所以它继承了CWnd类的成员函数,具有CWnd类的基本功能,可以编写代码移动、显示或隐藏对话框,并能根据对话框的特点增加新的成员函数,扩展它的功能。
1.1.3 对话框的组成
对话框主要由以下两部分组成:
(1) 对话框模板:对话框模板定义了对话框的特性(比如大小、位置和风格)以及对话框中每个控件的类型和位置。
(2) 对话框类:从CDialog类派生的对话框类提供编程接口来管理对话框。
1.2 模态对话框
对于模式对话框的编程可以按以下步骤进行。
(1) 根据要求创建对话框模板。
(2) 使用ClassWizard创建对话框类并进行各类事件函数的代码编写。
(3) 对视图类进行编辑,以便对话框能够被激活。
1.2.1 设计对话框模板资源
打开对话框编辑器:
- 使用菜单【Insert|Resource】打开Insert Resource对话框,选中Dialog后单击New按钮。
- 使用项目的ResourceView,找到Dialog资源,右击后选择Insert Dialog。
对话框编辑器如下图所示。
设计对话框模板资源有两个重要的内容:
- 从Controls工具栏中选择控件(Control,功能各异的小小零组件)加到对话框中,并调整其位置和大小
- 设置控件的Caption、ID以及其他属性
1.增加或删除控件
2.设置控件属性
属性设置在与每个控件相对应的属性对话框中进行。
打开控件属性对话框:
- 在控件上右击鼠标,在弹出的快捷菜单中选择Properties
- 选择控件,选择View|Properties菜单项
对话框的属性也是在对话框的属性对话框中设置。
在对话框任意空白处右击,在弹出的快捷菜单中选择Properties 。
3.测试对话框的运行效果
测试对话框的方法有下面3种:
- 选择菜单项Layout |Test。
- 单击布局工具栏上的Test按钮。
- 按快捷键Ctrl+T。
1.2.2 设计对话框类
主要包括下面几个方面:
- 从MFC的CDialog中派生出一个类,用来负责对话框行为。
- 利用ClassWizard把这个类和已编辑完成的对话框资源连接起来。
这意味着必须声明某些函数,用以处理相应的对话框消息,并将对话框中的控件对应到类的成员变量上,这也就是所谓的对话框数据交换(DDX,Dialog Data eXchange)。如果对这些变量内容有“确认规则”的话,ClassWizard也允许设定,这就是所谓的对话框数据验证(DDV,Dialog Data Validation)。
1.2.3 运行对话框
模态对话框的运行分两个步骤:
- 创建一个对话框对象
- 调用CDialog::DoModal()函数打开对话框
DoModal()函数负责模态对话框的创建和撤消,可以根据其回值是IDOK还是IDCANCEL来判断用户关闭对话框时按的哪一个键。
1.2.4 对话框数据交换和校验机制
CDialog类通过调用其成员函数DoDataExchange()实现对话框数据交换和验证,在DoDataExchange()中使用了MFC提供的CDataExchange类,该类实现对话框类的成员变量与控件之间的数据交换DDX和数据验证DDV。
DDX将成员变量与对话框控件相连接,完成数据在成员变量和控件之间的交换。DDV用于数据的校验,它能自动校验输入的数据(如字符串的长度或数值的范围)是否符合设计要求。
DoDataExchange()函数由框架调用。在应用程序MyDialog中,可以找到下列函数:
控件与成员变量之间的数据交换通过调用UpdateData()函数进行。
- UpdateData()函数只有一个BOOL类型的参数
- 当参数为TRUE时,MFC通过调用DoDataExchange()函数将数据从控件传递到关联的成员变量
- 当参数为FALSE时,数据从成员变量传递到关联的控件。
如下图所示。
1.3 非模态对话框
1.3.1 非模态对话框的特点
与模态对话框比较:
相同:创建对话框资源、添加对话框类、添加成员变量和消息处理函数的方法
不同:创建和退出对话框的方式
1.Visible属性
模态对话框不需要设置该属性,而非模态对话框必须具有Visible风格,否则对话框是不显示的。
另一种方法是调用CWnd::ShowWindow(SW_ SHOW)来显示对话框。
2.对话框窗口的创建方式
非模态对话框的创建是通过调用CWnd::Create()函数来实现的。
Create()函数与DoModal()函数不同之处是:Create()创建对话框后立即返回,而DoModal()函数在对话框关闭后才会返回。
3.对话框对象的创建方式
由于在Create()返回后,不能确定对话框是否已关闭,这样也就无法确定对话框对象的生存期,所以不能以局部变量的形式创建非模态对话框的对象,只能用new操作符动态创建,并且在调用对话框类的窗口类内声明一个指向对话框类的指针变量,通过该指针访问对话框对象。
4.窗口删除函数
非模态对话框必须调用CWnd::DestoryWindow()来关闭对话框。
模态对话框是调用CDialog::EndDialog()关闭对话框。由于默认的对话框函数OnOK()和OnCancel()都是调用EndDialog()关闭对话框的,该函数使对话框不可见但不删除对话框对象。所以非模态对话框类要定义自己的OnOK()和OnCancel()函数,调用DestoryWindow()来关闭对话框。
5.清理对话框对象的方式
与创建对象的方式new操作相对应,使用delete操作删除一个非模态对话框对象。
当屏幕上一个窗口被关闭后,框架会自动调用CWnd::PostNcDestroy()函数,也可以编写程序代码,在这个函数中清理非模态对话框对象。
6. 必须有一个标志表明非模态对话框是否是打开的
因为在非模态对话框打开的情况下,用户有可能再次选择打开该对话框,这时不能再创建一个新的非模态对话框。
程序根据标志来判断是打开一个新的对话框还是激活一个已打开的对话框。通常可以用拥有者窗口中的指向对话框对象的指针作为这种标志,当对话框关闭时,给该指针赋NULL值,以表明对话框对象已不存在了。
1.4 属性页对话框
属性页对话框实际上是一个包含了多个子对话框的对话框,这些子对话框通常被称为页(Page)。每次只有一个页是可见的,在对话框的顶端有一行标签,用户通过单击这些标签可以切换到不同的页。
为了支持属性页对话框,MFC提供了CPropertySheet类和CPropertyPage类。分别代表属性页对话框和对话框中的某一页。
1.5 通用对话框
1.5.1 CFileDialog类
用CFileDialog类提供的通用文件对话框,实现Windows标准的【打开】和【另存为】功能。
使用CFileDialog可按以下步骤进行。
(1)
构造
CFileDialog
类的对象。该类的构造函数为:
CFileDialog(
BOOL bOpenFileDialog,值为TRUE,构造【打开】对话框;值为
FALSE,构造“另存为”对话框
LPCTSTR lpszDefExt=NULL,默认的文件扩展名
LPCTSTR lpszFileName=NULL,出现在文件名编辑框中的初始文件名
DWORD dwFlags=OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter=NULL,CWnd *pParentWnd=NULL文件过滤器, 用于确定显示在文件列表中的文件类型
)
例如,以下字符串就是一个描述只在文件列表框中显示文本文件(*.txt)和Microsoft文件(*.doc)的过滤器。
CFileDialog dlg(TRUE,"bmp","*.bmp", OFN_HIDEREADONLY
|OFN_ALLOWMULTISELECT,"文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc||");
第1个参数TRUE:【打开】对话框;
第2个参数“bmp”:如果在文件名对话框中输入文件名时未指定扩展名,则会自动附加“.bmp”;
第3个参数“*.bmp”:文件名对话框中的初始文件名是*.bmp;
第4个参数代表dwFlags:不显示隐藏文件,且可以在列表框中进行多选;第5个参数是过滤器:在文件类型下拉列表框中显示了文本文件(*.txt)和Word文件(*.doc)。
(2) 调用成员函数DoModal( ),将对话框显示在屏幕上,并让用户从中选择文件。
(3) 如果DoModal( )返回的是IDOK,那么调用下表中的成员函数获取文件信息。
1.5.2 CColorDialog类
CColorDialog类提供了可以选择颜色的对话框,使得用户可以从颜色列表中选择要用的颜色。
对该类的使用可按下列步骤进行:
(1) 在视图类相应位置构造CColorDialog对象。
(2) 设置或修改成员变量m_cc来初始化对话框。m_cc的结构类型为COLORREF。
(3) 调用成员函数DoModal()来显示对话框并让用户从中选择颜色。
(4) 如果DoModal()返回的是IDOK,那么用户所做的颜色选择将保存在m_cc中。通过使用该类的成员函数GetColor()即可得到选择颜色的RGB值。
1.5.3 CFontDialog类
CFontDialog类封装了标准的【字体】对话框,使得用户可以从系统安装的字体列表中选择要用的字体。
CFontDialog类的使用步骤与CColorDialog的使用过程是一样的,只是m_cc的结构类型为LOGFONT。
在选择了字体后,可通过下表中的成员函数获取所选择的字体信息。
1.5.4 CPrintDialog类和CPageSetupDialog类
CPrintDialog类支持打印和打印设置对话框,通过这两个对话框用户可以进行与打印有关的设置。
1.5.5 CFindReplaceDialog类
CFindReplaceDialog类用于实现查找和替换对话框。这两个对话框都是非模态对话框,用于在正文中查找和替换指定的字符串。
总结
生活,就是要好好过。切不要被失败折磨,纵然失魂落魄,纵然四面楚歌,纵然心爱的人,她也不爱我!我们也要好好爱自己!好好生活!