|
前面我们讲过用AppWizard创建工程时可以有多种类型可以选择。这一部分我们创建的AppWizard名字叫SDIAutomationWiz,在默认情况下,用这个AppWizard创建的工程类型是支持自动化的SDI工程。
打开工程的New 对话框,在Project
List中选择Custom
AppWizard,在Project
Name编辑框中输入SDIAutomationWiz,单击OK进入第一个步进对话框,选择“Standard MFC
AppWizard steps”,然后指定一个它在Project
List中显示的名字。因为这个AppWizard没有额外的步进对话框,因此步进数编辑框中填写0,单击Next按钮到下一步。选择“MFC AppWizard Executable”,语言支持为中文,单击Finish按钮,出现确认对话框。单击OK后便开始创建新的AppWizard工程。
——定义CCustomAppWiz
类
虽然编译后的Custom
AppWizard文件扩展名都是.awx,但是它实际上就是一个通常我们使用的Windows动态链接库(DLL)文件。如果你打开SDIAutomationWiz.cpp文件,你就会看到如下的DLLMain()函数代码:
// Defining the DLLMain() Function
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD
dwReason,
LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("SDIAUTOMATIONWIZ.AWX Initializing!\n");
// Extension DLL one-time initialization
AfxInitExtensionModule(SDIAutomationWizDLL, hInstance);
// Insert this DLL into the resource chain
new CDynLinkLibrary(SDIAutomationWizDLL);
// Register this Custom AppWizard with MFCAPWZ.DLL
SetCustomAppWizClass(&SDIAutomationWizaw);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("SDIAUTOMATIONWIZ.AWX Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(SDIAutomationWizDLL);
}
return 1;
// ok
}
除了常规的CDynLinkLibrary MFC扩展动态链接库例程之外,还有一个对SetCustomAppWizClass()函数的调用。这个函数是从MFCAPWZ.DLL输出的,用于传递定制AppWizard 中CCustomAppWiz派生类的指针。因为MFCAPWZ.DLL通过调用CCustomAppWiz的成员函数来控制所有AppWizard的执行,因此它必须用这个指针来调用CCustomAppWiz派生类中重载的成员函数。
有一点必须牢记在心,那就是尽管你创建了定制的AppWizard,但MFCAPWZ.DLL仍然控制着一切。换句话说,你定制的AppWizard只是用于显示步进对话框,确定对话框以什么顺序显示,以及设置新工程的模人选项。一些重要的工作,诸如解析模板文件,合并Dictionary中的宏和模板文件中的占为符,创建工程文件等等还是要MFCAPWZ.DLL来做。
前面我们讲过,CCustomAppWiz类负责AppWizard与MFCAPWZ.DLL之间的通讯。实际上这种通讯是单边的。MFCAPWZ.DLL告诉你的CCustomAppWiz对象什么时候需要调用相应的虚拟成员函数。
CCustomAppWiz类中大约有十来个函数,其中只有五个函数是可以看到并使用的常用例程。通过这些函数的命名你基本上就能了解其主要作用。例如,InitCustomAppWiz()函数是进行初始化,包括初始化宏。除此之外,ExitCustomAppWiz()函数的作用是卸载AppWizard。
另外,还有两个函数用来控制步进对话框的显示顺序。Next()和Back()。不说肯定你也知道,这两个函数与AppWizard对话框中的Next和Back按钮是关联的。
最后一个很重要的函数是CustomizeProject(),一旦程序员完成工程选项的设置,AppWizard便创建工程的make文件并定义工程缺省的debug和release配置。然后AppWizard调用CustomizeProject()函数,以便定制的AppWizard能在存储工程之前修改make文件设置。
——宏指令的处理
我们已经知道了宏的初始化是在InitCustomAppWiz()中进行的,我们也知道了CCustomAppWiz类有一个成员变量m_Dictionary,它存储宏名及其值。因为这个成员变量是CMapStringToString类型的,用标准的MFC映射函数就能get或者set不同的宏,请看下列代码:
// retrieve value for Automation
CString strValue;
m_Dictionary.Lookup(_T("AUTOMATION"),
strValue);
// Include support for context sensitive
help
m_Dictionary.SetAt(_T("HELP"),
strValue.Compare("1"));
现在打开SDIAutomationWizAW.cpp文件,在InitCustomAppWiz()函数末尾敲入:
m_Dictionary.SetAt(_T("PROJTYPE_SDI"),
_T("1"));
m_Dictionary.SetAt(_T("PROJTYPE_MDI"),
_T("0"));
m_Dictionary.SetAt(_T("AUTOMATION"),
_T("1"));
然后构造(build)定制的AppWizard工程。如果没有出错的话,AppWizard的.awx文件会被自动拷贝到专门的目录中,以便MFCAPWZ.DLL能找到它。
现在按下Ctrl+N,新定制的AppWizard应该出现在New对话框的Project清单中。如果你使用新的AppWizard,你会看到工程的默认选项是SDI程序并支持自动化。通过这个简单的Demo,我们基本上了解了如何通过定制AppWizard来设置默认的工程选项。
如果要分发你创建的AppWizard,只要分发.awx文件就可以了,把它拷到Visual
Studio的模板文件目录即可。
在这一部分,我们定制了一个简单的AppWizard,通过一个例子示范了如何处理宏字典。在第三部分中,我们将涉及更多定制AppWizard的内容,并且还要制作一个实用价值很高的AppWizard。包括新增加一个步进对话框,获得新步进对话框中的输入信息。用这个定制的AppWizard创建的所有工程都会在其“关于”对话框中显示在步进对话框输入的信息,并通过静态控制和图像建立URL链接。此外,用这个AppWizard创建的每一个源文件都会自动建立程序员自己的专用注释。
[待续]
|