5.2.4 对话框
对话框是人机交流的一种方式,用户对对话框进行设置,计算机就会执行相应的命令。对话框可以分为模式对话框和无模式对话框两种类型。
1.对话框的主要组成
对话框资源
可以使用对话框编辑器来配置对话框的界面,如对话框的大小、位置、样式以及对话框中控件的类型和位置等。另外,我们还可以在程序的执行过程中动态创建对话框资源。
对话框类
在MFC程序中,可以使用向导帮助用户建立一个与对话框资源相关联的类,通常这个类由CDialog类派生。
2.对话框类--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函数来彻底地删除它。
3.对话框数据交换和验证机制
在VC中,所有的对话框函数都是使用C++(www.cppentry.com)代码实现的,它并没有采用特殊的资源或"奇特"的宏,但却可以很好地实现用户与应用程序之间的交互工作,这里的关键就在于对话框应用程序中广泛采用的对话框数据交换和验证机制。
对话框数据交换(Dialog Data Exchange,DDE)用于初始化对话框中的控件并获取用户的数据输入,而对话框数据验证(Dialog Data Validation,DDV)则用于验证对话框中数据输入的有效性。MFC在每个对话框类中提供了一个用于重载的虚函数--DoData Exchange来实现对话框数据交换和验证工作。
对话框数据交换
如果使用DDE机制,则通常在OnInitDialog程序或对话框构造函数中设置对话框对象成员变量的初始值。在对话框即将显示前,应用程序框架的DDE机制将成员变量的值传递给对话框的控件,当对话框响应DoModal或Create而被显示时,对话框控件将"显示"这些值。Cdialog类中的OnInitDialog函数默认时将调用CWnd类的UpdateData成员函数初始化对话框中的控件。UpdateData函数的原型如下:
BOOL UpdateData( BOOL bSaveAndValidate = TRUE ); |
函数参数为TRUE,即将对话框及其控件中的数据传递给程序代码中的成员变量;函数参数为FALSE,即将类中的数据状态传递给对话框及其控件。
当用户重载DoDataExchange函数时,也就为每一个数据成员(控件)指定了一个DDE函数调用。
对话框数据验证
除了调用DDE参数指定数据交换外,用户还可以使用DDV函数进行对话框数据验证。在调用控件的DDE函数后,必须立即调用该控件的DDV函数。大部分DDV函数的原型如下所示。
DDV_MinMaxCustom(pDX, Data, MinData, MaxData); |
其中,参数pDX是一个指向CdataExchange对象的指针,参数Data中存放着即将被验证的数据,后两个参数用于定制数据的范围。
如果仅仅需要使用对话框数据,一般没有必要了解数据交换/验证的核心内容。但在了解了数据交换和验证的实质后,用户就可以编写自己的数据交换和验证代码,定制DDE/DDV。
【责任编辑:
云霞 TEL:(010)68476606】