AppWizard即应用程序向导,它是Visual Studio开发环境中强大的编程工具之一,用它可以创建各种不同类型的程序。比如Win32应用、ATL、MFC应用等等。在Windows的术语中,向导(wizard)一词指得是一个应用程序,它的一个主要特点就是提供一系列对话框引导用户进行必要的选择来完成给定的任务。VC中的应用程序向导——AppWizard提供一系列特定工程类型对话框来让程序员定义各种类型的新工程。其中每一个对话框都显示一些用来指定工程类型的选项。例如,用AppWizard创建Windows DLL的时候,第一个对话框让程序员指定诸如要创建什么类型的DLL,是常规类型还是MFC扩展类型,是否要包括自动化支持,以及要不要源代码注释等等。
根据程序员所填充的对话框,AppWizard会自动创建构造工程所需的框架文件,它们包括:工程文件、工作间文件、源代码文件、头文件、资源文件等等。AppWizard是Visual Studio开发环境中使用最多的工具之一。尽管如此,AppWizard也有它的不足之处。那就是常用的工程类型都是内建在Visual Studio中,无法创建自己的AppWizard。自从有了Custom AppWizard(Visual C++ 4.0)以后,这个问题得到了解决。Custom AppWizard也就是定制的AppWizard。在创建类似的多个工程时,Custom AppWizards显得特别有用。例如你创建的工程都是SDI,并且都支持自动化(automation),那么你就可以创建一个自己定制的 AppWizard,将SDI自动化设为默认选项。这样可以提高工作效率。此外,利用Custom AppWizard也可以创建具有个性化的工程。例如你想要所有工程都有一个“关于”对话框,并且在这个对话框中显示个人信息或者公司的标徽及其它专有信息,每个源代码文件中都加上自己的专门注释。那么通过创建一个Custom AppWizard很容易实现这个需求。你甚至可以定义并显示自己定制的对话框来收集工程类型所需的信息和选项。本文的第一部分我们将讨论AppWizard的工作原理,然后在后续部分中循序渐进地学习如何创建Custom AppWizard。最终我们将创建一个在实际编程中非常实用的Custom AppWizard。并提供全部源代码。
在学会使用Custom AppWizard之前,首先必须了解AppWizard的工作原理,理解 AppWizard是如何根据不同的用户选择来创建工程的。
AppWizard有一个管理装置(manager),它不是一个单独的应用程序。Custom AppWizard运行于Visual Studio框架之中。AppWizard的这个所谓的“管理器”,实际上就是MFCAPWZ.DLL,它控制不同的AppWizard执行。在创建新工程的对话框中,“Project”标签是默认的选项,列表框中显示出内建的工程类型。此外,这个列表框中还列出用户定制的AppWizard,如图一所示。
图一
这些定制AppWizard文件扩展名为*.awx,它们存放在一个特定的目录中。如果安装VC6.0时是按照默认的路径安装的,则定制的AppWizard文件在成功编译后都会被存放到\Program Files\Microsoft Visual Studio\Common\MSDev98\Template文件夹中。注意列表框中此新的列表项“MFC AppWizard (exe) – VC知识库”,这就是我们后面要定制的AppWizard。从这里可以看出,只要产生了*.awx文件,那么它就会与标准的(或者说内建的)Visual C++ AppWizard一起自动显示在这个列表框中。
——CCustomAppWiz 类和Dictionary字典
CCustomAppWiz 基类提供了MFCAPWZ.DLL 和Custom AppWizard之间的通讯服务。CCustomAppWiz()成员函数的实现就在MFCAPWZ.DLL中。为了实现特定应用的行为,你只要从CCustomAppWiz派生一个类,改写相应的虚拟函数,然后在MFCAPWZ.DLL运行时调用SetCustomAppWizClass()函数注册派生类即可。
通常,AppWizard显示一系列对话框获取创建新工程所需的设置。每一个步进对话框显示不同的选项。AppWizard将这些选项的值存储在一个串映射中。这个串映射就叫做Dictionary字典。Dictionary字典实际上是一个CCustomAppWiz 类的成员变量(m_Dictionary),其类型为CMapStringToString。Dictionary将AppWizard宏映射到相关联的值。这里所说的宏是指工程选项或设置的名称。例如,在创建MFC的时候,你可以选择应用程序为SDI,那么,Dictionary中就会有一个名为PROJTYPE_SDI的宏。Dictionary中这个项目的值就是1,否则这个与这个宏关联的值为0。
m_Dictionary成员变量可以被用于创建宏,删除宏或者更新宏的值。因为m_Dictionary是一个CMapStringToString对象,肯定有相应的成员函数存取不同宏的值。下面的代码返回PROJTYPE_SDI宏的值,它被用于判断这个工程是不是一个SDI应用。
01.
m_Dictionary.Lookup(
"PROJTYPE_SDI"
, m_strProjType);
02.
03.
if
(_T(
"1"
) == m_strProjType)
04.
05.
{
06.
07.
// SDI类型应用
08.
09.
}
10.
11.
else
// 其它类型的程序
12.
13.
{
14.
15.
}
MFCAPWZ.DLL提供了一些标准宏,任何其它定制AppWizard所需要的宏都可以用SetAt函数添加到Dictionary字典中。你从在线文档中可以找到六十多个标准宏
当你创建Custom AppWizard并按下Finish按钮后,MFCAPWZ.DLL用Dictionary创建新的工程文件。每一个AppWizard(不论是标准的还是定制的)都有一套模板文件用于创建AppWizard生成的工程源文件。Dictionary中的值被用于与模板文件相连接来创建最终的输出(新的工程文件)。下面是一个例子,中文的基于对话框程序的模板资源文件名叫DlgLoc_chs.rc。下面是从中摘录出的一段:
01.
...
02.
03.
IDD_ABOUTBOX DIALOGEX 0, 0, 160, 129
04.
05.
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
06.
07.
CAPTION
"关于$$ROOT$$"
08.
09.
...
注意这里 $$ROOT$$ 串的用法。当MFCAPWZ.DLL创建新工程文件时,它首先扫描每一个模板,查找以$$开始并以$$结尾的串。在这两个前缀和后缀之间的文本串叫做占位苻。每一个占位符是Dictionary中一个宏的名字。MFCAPWZ.DLL在Dictionary中查询占位符的值并用这个值替换占位符。当所有的占位符都被Dictionary中相应的值替换之后,工程文件也就产生了。
——用MFCAPWZ.DLL替代占为符
为了理解MFCAPWZ.DLL用Dictionary中宏的值替换模板文件的占位符。我们来做一个实验:
1、 用AppWizard创建一个基于对话框的应用程序,将工程取名为MyTestDlgApp。
2、 创建完工程之后,以文本方式打开MyTestDlgApp.rc文件。
3、 找到IDD_ABOUT的对话框模板资源。
4、 你应该看到原来模板文件中$$ROOT$$占位符已经被工程的名字(MyTestDlgApp)替换掉了。这是因为Dictionary有一个ROOT宏,其缺省值被设置为工程的名字。
宏即可被用于定义模板文件中指定的占位符的替换值,有时AppWizard也用宏来协助步进对话框的显示,或者确定用哪个模板来创建新的工程文件。例如,如果Dictionary中PROJTYPE_SDI宏的值为1,则创建的应用程序是SDI类型。但是,如果PROJTYPE_DLG宏的值为1的话,创建的应用程序是基于对话框的。根据宏的值是否为1,MFCAPWZ.DLL使用不同的模板文件来创建工程文件。
大多数AppWizard都由一系列固定的对话框组成。其中后一个对话框的显示完全依赖于前一个对话框所选择的选项来决定。这种多步进对话框形式称为轨迹。创建MFC应用程序的AppWizard是一个多轨迹的AppWizard。
——多轨迹AppWizard
多轨迹AppWizard提供了更为复杂的应用程序设置。为了理解多轨迹AppWizard概念,请做一个如下实验:
1、 按下Ctrl+N创建新工程
2、 单击“Project”标签,然后选中“MFC AppWizard (exe)”。
3、 注意对话框的标题条内容为“MFC AppWizard - Step 1”,没有指明总共有几步,这是因为总共的步进数在你决定要创建的MFC工程类型前时未知的。
4、 看一下不同类型工程的选项有何差别:single document (SDI),multiple document (MDI),和 dialog-based。选择multiple document (MDI)类型,然后单击Next按钮。
5、 注意标题条的内容中指定了总共的步进数——“MFC AppWizard - Step 2 of 6”。由于你选择了MDI类型,这个类型总共有六个步进对话框,每一个步进对话框包含特定的基于文档的MFC应用程序选项。
6、 单击Back按钮,选择基于对话框的工程类型,然后单击Next按钮。这一次标题条的内容指定的步进总数是——“MFC AppWizard - Step 2 of 4”。这说明创建基于对话框的应用程序共有四个步进对话框。
以上是对AppWizards 及其工作原理的讨论。在下一部分我们将尝试创建一个简单的Custom AppWizard。
[待续]
联系客服