|
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应用。
m_Dictionary.Lookup("PROJTYPE_SDI",
m_strProjType);
if (_T("1") == m_strProjType)
{
// SDI类型应用
}
else // 其它类型的程序
{
}
MFCAPWZ.DLL提供了一些标准宏,任何其它定制AppWizard所需要的宏都可以用SetAt函数添加到Dictionary字典中。你从在线文档中可以找到六十多个标准宏
当你创建Custom AppWizard并按下Finish按钮后,MFCAPWZ.DLL用Dictionary创建新的工程文件。每一个AppWizard(不论是标准的还是定制的)都有一套模板文件用于创建AppWizard生成的工程源文件。Dictionary中的值被用于与模板文件相连接来创建最终的输出(新的工程文件)。下面是一个例子,中文的基于对话框程序的模板资源文件名叫DlgLoc_chs.rc。下面是从中摘录出的一段:
...
IDD_ABOUTBOX DIALOGEX 0, 0, 160, 129
STYLE DS_MODALFRAME | WS_POPUP |
WS_CAPTION | WS_SYSMENU
CAPTION "关于$$ROOT$$"
...
注意这里 $$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。
[待续]
|