组成
对话框主要由两部分组成。
对话框资源:可以使用对话框编辑器来配置对话框的介面,如对话框的大小、位置、样式,对话框中控制项的类型和位置等。另外,我们还可以在程式的执行过程中动态建立对话框资源。
对话框类:在MFC程式中,可以使用向导帮助使用者建立一个与对话框资源相关联的类,通常这个类由CDialog类派生。
类型
对话框可以分为模式对话框和无模式对话框两种类型。
CDialog
为了能够方便的操作对话框,MFC为使用者提供了CDialog类。它是在萤幕上显示对话框的基类,与对话框资源紧密相关,提供了管理对话框的接口,封装了一些对话框的相关操作。
从CDialog的定义代码可以看出,Cdialog提供了两套构建Cdialog对象的系统,分别用于模式对话框和无模式对话框。
无模式对话框对象的构建过程,它首先调用缺省的构造函式生成对话框对象,然后调用Create函式建立和初始化对话框。Cdialog类中的Create函式有两种函式原型:
BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );
其中,
参数lpszTemplateName是无模式对话框模板资源的标志符;
参数nIDTemplat是对话框模板资源的标志符,它通常以IDD_开头(例如IDD_DIALOG1);
参数pParentWnd是指向对话框对象所属的父视窗的指针(如果它为NULL,则表示对话框对象的父视窗是应用程式主视窗)。如果希望对话框中它的父视窗建立后马上被显示,就必须把对话框模板设定为WS_VISIBLE形式。否则,需要调用ShowWindow函式来显示对话框。
对于模式对话框,其构造函式如下所示:
CDialog( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
CDialog( UINT nIDTemplate, CWnd* pParentWnd = NULL );
构造函式的参数说明与无模式对话框的Create函式类似。在模式对话框中,当建立了对话框对象后,可以通过调用DoModal函式来显示对话框。
一般情况下,无论是模式对话框还是无模式对话框,都有两个按钮OK和CANCEL。对话框为它们提供了默认的讯息处理函式OnOk和OnCancel。调用这两个函式都将关闭对话框。所不同的是,默认的OnOk函式中关闭对话框前将更新对话框资料,而默认的OnCancel函式不更新对话框资料。
当CDialog类检测到OK或Cancel键时,它将调用::EndDialog函式。EndDialog函式虽然结束了对话框应用程式,但却并没有移除对话框对象,释放记忆体。这对于模式对话框来说,不是问题,它的生存时间不长,我们一般在堆上建立它们;但无模式对话框则不同,它的生存时间更长,我们通常在堆上建立它们,并且希望它在消失之前能够移除自己。因此,大多数情况下,我们需要在无模式对话框中重载OnOK和OnCancel函式,加入DestroyWindows函式来彻底地移除它。
交换验证
简介
在VC中,所有的对话框函式都是使用C++代码实现的,它并没有採用特殊的资源或"奇特"的宏,但却可以很好地实现使用者与应用程式之间的互动工作,这裏的关键就在于对话框应用程式中广泛採用的对话框资料交换和验证机製。
对话框资料交换(DDX,Dialog Data Exchange)用于初始化对话框中的控制项并获取使用者的资料输入,而对话框资料验证(DDV,Dialog Data Validation)则用于验证对话框中资料输入的有效性。MFC在每个对话框类中提供了一个用于重载的虚函式--DoDataExchange来实现对话框资料交换和验证工作。
资料交换
如果使用DDX机製,则通常在OnInitDialog程式或对话框构造函式中设定对话框对象成员变数的初始值。在对话框即将显示前,应用程式架构的DDX机製将成员变数的值传递给对话框的控制项,当对话框回响DoModal或Create而被显示时,对话框控制项将"显示"这些值。Cdialog类中的OnInitDialog函式默认时将调用CWnd类的UpdateData成员函式初始化对话框中的控制项。UpdateData函式的原型如下:
BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
函式参数为TRUE,即将对话框及其控制项中的资料传递给程式代码中的成员变数;
函式参数为FALSE,即将类中的资料状态传递给对话框及其控制项。
当使用者重载DoDataExchange函式时,也就为每一个资料成员(控制项)指定了一个DDX函式调用。
资料验证
除了调用DDX参数指定资料交换外,使用者还可以使用DDV函式进行对话框资料验证。在调用控制项的DDX函式后,必须立即调用该控制项的DDV函式。大部分DDV函式的原型如下所示。
DDV_MinMaxCustom(pDX, Data, MinData, MaxData);
其中,参数pDX是一个指向CdataExchange对象的指针,参数Data中存放着即将被验证的资料,后两个参数用于定製资料的範围。
CdataExchange类
如果仅仅需要使用对话框资料,一般没有必要了解资料交换/验证的核心内容。但在了解了资料交换和验证的实质后,使用者就可以编写自己的资料交换和验证代码,定製DDX/DDV.
控制项
控制项是一个可以与其互动以完成输入或运算元据操作的对象,它也是一种特殊的视窗。控制项通常出现在对话框或工具列中。Windows提供了多种多样的控制项,在MFC应用程式中,能够使用的控制项通常可以分为三种。
1)windows公用控制项:包括编辑控制项、按钮、列表框、组合框、滑动条控制项等,另外也包括所有者描述的控制项。
2)ActiveX控制项:既可以在对话框中使用,也可以在HTML网页中使用。
3)由MFC提供的其他控制项类
我们主要介绍第一种类型的控制项--Windows公用控制项。
Windows作业系统提供了多种windows公用控制项,这些控制项对象都是可程式的,Visual C++的对话框编辑器支持将这些控制项对象增加到对话框中。使用者可以在工具箱的对话框编辑器中看到这些windows公用控制项。MFC为了更好的支持windows公用控制项,提供了多种控制项类,每一个控制项类封装一种控制项,并提供相应的成员函式来管理操作控制项。
讯息框
我们在使用Windows系统的过程中经常会见到讯息对话框,提示我们有异常发生或提出询问等。因为在软体开发中经常用到讯息对话框,所以MFC提供了两个函式可以直接生成指定风格的讯息对话框,而不需要我们在每次使用的时候都要去建立对话框资源和生成对话框类等。这两个函式就是CWnd类的成员函式MessageBox()和全局函式AfxMessageBox()。
一、CWnd::MessageBox()函式和AfxMessageBox()函式的用法
下面分别讲解两个函式的用法。
1、CWnd::MessageBox()函式
CWnd::MessageBox()的函式原型如下:
int MessageBox(
LPCTSTR lpszText,
LPCTSTR lpszCaption = NULL,
UINT nType = MB_OK
);
参数说明:
lpszText:需要显示的讯息字元串。
lpszCaption:讯息对话框的标题字元串。默认值为NULL。取值为NULL时使用默认标题。
nType:讯息对话框的风格和属性。默认为MB_OK风格,即只有"确定"按钮。
nType的取值可以是下面两个表中任取一个值,也可以是各取一个值的任意组合。即可以指定一个对话框类型,也可以指定一个对话框图示,还可以两者都设定。
对话框类型表:
nType 取值参数说明
MB_ABORTRETRY 有"终止"、"重试"和"忽略"按钮
MB_OK 有"确定"按钮
MB_OKCANCEL 有"确定"和"取消"按钮
MB_RETRYCANCEL 有"重试"和"取消"按钮
MB_YESNO 有"是"和"否"按钮
MB_YESNOCANCEL 有"是"、"否"和"取消"按钮
对话框图示类型表:
nType
MB_ICONEXCLAMTION
MB_ICONWARNING
MB_ICONASTERISK
MB_ICONINFORMATION
MB_ICONQUESTION
MB_ICONHAND
MB_ICONSTOP
MB_ICONERROR
如果想要设定nType的值为类型和图示的组合,可以像这样取值:MB_OKCANCEL | MB_ICONQUESTION。按位取或就可以了。
2、AfxMessageBox()函式
AfxMessageBox()的函式原型为:
int AfxMessageBox(
LPCTSTR lpszText,
UINT nType = MB_OK,
UINT nIDHelp = 0
);
参数说明:
lpszText:同CWnd::MessageBox()函式
nType:CWnd::MessageBox()函式
nIDHelp:此讯息的帮助的上下文ID。默认值为0,取0时表示要使用应用程式的默认帮助上下文。
二、CWnd::MessageBox()和AfxMessageBox()的返回值
我们在调用了上面两个函式后,都可以弹出模态讯息对话框。讯息对话框关闭后,我们也都可以得到它们的返回值。两者的返回值就是使用者在讯息对话框上单击的按钮的ID,可以是以下值:
IDABORT:单击"终止"按钮。
IDCANCEL:单击"取消"按钮。
IDIGNORE:单击"忽略"按钮。
IDNO:单击"否"按钮。
IDOK:单击"确定"按钮。
IDRETRY:单击"重试"按钮。
IDYES:单击"是"按钮。



















