在Visual C++中定制AppWizard (一)
2010-07-25 20:46:44 来源:WEB开发网——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应用。
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。
- ››Visual Studio自定义调试窗体两个小技巧
- ››Visual Studio 2005 Team Edition for Database P...
- ››Visual C#两分钟搭建BHO IE钩子
- ››Visual C++优化对大型数据集合的并发访问
- ››定制个性化的对话框窗口类
- ››VISUAL C++中的OCX控件的使用方法
- ››Visual C++实现视频图像处理技术
- ››Visual C++制作一个Sniffer实例
- ››Visual Studio 2010 中文试用版全面提供下载
- ››Visual C++剪贴板操作不完全攻略
- ››Visual C++编程实现摄像头视频捕捉
- ››Visual C++ 6.0 API函数操作技巧集
更多精彩
赞助商链接