6.6.4 创建向导对话框
本小节将介绍如何来创建一个一般属性页对话框。
【实例6-5】 创建向导对话框
光盘路径 /06/dialog_5/
实例目的 创建向导对话框
1.创建工程
在IDE中依次选择“File”→“New”菜单命令,或直接按快捷键“Ctrl+N”,打开“New”对话框。
在“New”对话框中单击“Projects”选项卡,在列表框中选择“MFC AppWizard(.exe)”项,在“Project name”文本框中输入“dialog_5”,其他使用默认值,单击“OK”按钮,弹出“MFC AppWizard-Step1”对话框。
在“MFC AppWizard-Step1”对话框中,选中“Multiple Document”单选按钮,其他使用默认值,然后单击“Finish”按钮,在弹出的“New Project Information”对话框中单击“OK”按钮,就可以完成工程的创建。
2.创建弹出属性页对话框的菜单
在上面创建的对话框中添加一个菜单项下挂一个菜单,菜单命令的消息响应函数用来弹出一个向导对话框。
下面首先在菜单资源中添加菜单项和下拉菜单。
在工作区的Resource View标签中双击“dialog_5 resource”→“Menu”→“IDR_dialog_5 TYPE”条目,打开菜单资源。
选中菜单资源中的“查看”菜单,弹出下拉的菜单,选中下面的一个空白菜单项。
单击鼠标右键,选中弹出菜单的Properties菜单命令,弹出属性对话框,单击其中的Keep Visible按钮,使属性对话框始终显示在前端。
选中General标签中的Separator,在菜单资源中添加一个分隔条,同时在最下面又自动产生一个空白菜单。
选中空白菜单,在属性对话框的General中输入ID_VIEW_WIZARD,在Caption中输入“向导对话框(&W)…”,同时下面又会自动增加一个空白的菜单。
此时如果编辑、链接和运行程序,可以看到新增加的菜单项是灰色的。下面为刚刚创建的菜单项增加消息响应函数。
通过菜单“View”→“ClassWizard”打开MFC ClassWizard对话框,在Class name项中选择CDialog_5View,在Object IDs中选择ID_VIEW_WIZARD,在Message中选择消息COMMAND,单击“Add Function”按钮添加菜单命令的消息响应函数。函数名取默认值。
3.创建向导对话框
通过往工程中添加组件来创建向导对话框的操作与上面创建一般属性页的过程基本一致。
通过菜单命令“Project”→“Add to Project”→“Components and Controls…”打开对话框“Components and Controls Gallery”,如图6-40所示。
在“Components and Controls Gallery”对话框中的目录列表中双击“Visual C++(www.cppentry.com) Components”条目,目录列表改变,拖动滚动条,找到“Wizard”项并选中,如图6-47所示。
在图6-40中,单击“Insert”按钮,在弹出的“Micrsoft Visual C++(www.cppentry.com)”消息对话框中单击“确定”按钮,弹出“Property Sheet Wizard”对话框。
在“Property Sheet Wizard”对话框中选择所要添加的属性框类型。默认的是一般类型的属性框即选中的是“Property Sheet”,单击“下一步”按钮。
在紧接着弹出的对话框中的“Support previewing”复选框要求确认是否在属性框中添加预览功能,默认值为不添加预览功能。保持默认值,单击“下一步”按钮。
在接着弹出的对话框中要求选择在哪个类中对属性框进行操作。通过“ComboBox”控件,选中CDialog_5View 。单击“下一步”按钮。
在接着弹出的对话框中,要求确认属性框中的属性页个数,默认值为5。保持默认值,单击“下一步”按钮。
在接着弹出的对话框中要求确认将要添加的CPropertySheet类和CPropertyPage类的派生类的名称。可以通过单击Change按钮来改变。保留默认值,单击“完成”按钮。为了与一般属性页对话框区别,改变默认值如下。
将CPropertySheet类的派生类名称由CMyPropertySheet改为CMyWizardSheet,将头文件名和源文件名分别改为MyWizardSheet.h和MyWizardSheet.cpp。
将CPropertyPage1类的派生类名称由CMyPropertyPage1改为CMyWizardPage1,头文件名和源文件名分别改为MyWizardPage1.h 和MyWizardPage1.cpp。
将CMyPropertyPage2改为CMyWizardPage2。
将CMyPropertyPage3 改为CMyWizardPage3。
将CMyPropertyPage4 改为CMyWizardPage4。
将CMyPropertyPage5 改为CMyWizardPage5。
改变完毕,“Property Sheet Wizard”对话框显示如图6-48所示。

图6-47 选中“Wizard”项
图6-48 “Property Sheet Wizard”对话框修改完毕
单击“完成”按钮。
通过上述步骤,在程序中自动加入了下面的一些内容:
一个CPropertySheet类的派生类CMyWizardSheet。
5个CPropertyPage类的派生类:CMyWizardPage1~CMyWizardPage5。
与CMyWizardPage1~CMyWizardPage5类相关联的对话框资源。
在Dialog_5View.cpp文件的头部添加了一条包含语句:
#include "MyWizardSheet.h"
在CDialog_5View类中添加了CDialog_5View::OnWizard ()函数。
只要调用CDialog_5View::OnWizard ()函数就可以弹出刚刚创建的向导对话框。下面在菜单“Dialog”→“向导对话框…”的响应函数中调用该函数。
定位到函数CDialog_5View::OnWizard (),加入下面的代码:
编译、链接和运行程序,测试向导对话框的效果,如图6-49所示。
通过运行,可以发现目前在5个向导对话框中,页面和按钮始终是一样的,并没有因为在第一页而使按钮“上一页”变灰,也没有在最后一页将按钮“下一页”变为“完成”按钮。这些工作要通过手工添加一些代码来实现。

图6-49 向导对话框
另外,如果查看对话框资源,可以发现:虽然在创建向导对话框的过程中,为了和前面创建的一般属性页对话框区别,将默认的类名称和文件名作了相应的修改。但是,自动创建的对话框资源的标识号却没有作相应的修改。其中,标识号为IDD_PROPPAGE1和IDD_PROPPAGE2的对话框资源属于一般属性页的资源,标识号为IDD_PROPPAGE11、IDD_PROPPAGE21、IDD_PROPPAGE3、IDD_PROPPAGE4和IDD_PROPPAGE5的对话框资源属于向导对话框的资源。如果要修改对话框资源的标识号,仅仅通过修改属性框中的“General ID”项的内容是不够的,而要将工程中所有的相应的标识号改变。具体操作时可以先通过菜单“Edit”→“Find in Files…”查找到所有使用原来标识号的地方,然后一一修改为新的标识号。
下面为CMyWizardShee类定义一个全局指针,这样使用时比较方便,因为: CMyWizardPage1~CMyWizardPage5类的对象是作为CMyWizardSheet类的成员变量 存在的,如果定义了CMyWizardSheet类的全局指针,可以在CMywizardPage1~CMyWizardPage5类中通过该指针方便地调用属于CPropertySheet类的成员函数。比如调用对按钮进行控制的SetWizardButtons成员函数。
通过CMyWizardSheet类的全局指针,可以在一个属性页中方便地调用另一个属性页中的变量,使得向导对话框能够连续起来。
为此,下面在CDialog_5View 类中定义一个CMyWizardSheet类的全局指针,并通过该指针在不同的属性页中对属性框中的按钮模式进行设置。步骤如下。
在文件CDialog_5.cpp的头部,紧接着#include语句后面添加下面的语句:
CMyWizardSheet*m_pWizardSheet ; //全局指针定义
定位到函数CDialog_5View::OnWizard(),将内容改变如下:
在文件MyWizardPagel.cpp的头部,其他#include 语句之后,加入对全局指针m_pWizardSheet进行声明的代码:
类CMyWizardPage1~CMyWizardPage5共处于同一个源文件CMyWizardPage1.cpp。现在可以在这5个类的成员函数中使用全局指针m_pWizardSheet了。
通过ClassWizard,分别往CMyWizardPage1~CMyWizardPage5类中添加响应WM_INITDIALOG消息的函数OnInitDialog ()。
定位到函数CMyWizardPagel::OnInitDialog(),加入以下代码:
编译、链接和运行程序,测试向导对话框的效果,如图6-50所示

图6-50 改进后的向导对话框的效果
【责任编辑:
杨硕 TEL:(010)68476636-8001】