分类: C/C++
2008-04-02 18:40:29
在第一部分中我们介绍了Custom AppWizard的概念及其工作原理。在这一部分,我们将尝试用Custom AppWizards来创建一个最简单的Custom AppWizard。 首先,我们先创建一个什么事情也不做的Custom AppWizard,主要是了解它的创建过程和步骤。按Ctrl+N 打开New对话框,新建一个Custom AppWizards工程。填入工程名字后单击OK,从步进对话框的标题中,我们可以了解到总共有两个步骤,在第一个步的对话框中包含三个输入域。 第一个输入域是新Custom AppWizards的起点。它有三个单选按钮: |
l Existing project——这个选项是以一个现存的工程作为蓝本来创建Custom AppWizards。使用这个选项有两个缺点。第一,AppWizards创建的是一个已经存在的工程。第二,AppWizards创建的工程文件名和类名必须与现存工程的文件名和类名一致。 l Standard MFC AppWizard steps——这个选项是最常用的选项,它创建的AppWizard模板可用于每一种MFC支持的工程类型。从修改各种MFC工程模板文件的灵活性方面,这个选项也是最灵活的。因为这是最通用的一种定制AppWizard类型,所以我们将以它为例。 l Your own customized steps——这个选项全新定制一组步进对话框和选项。例如,假设你需要一个定制的AppWizard来自动创建一个非MFC应用程序。这时你就得用这个选项创建所有自己定制的对话框。 第二个输入域让你命名新建的定制AppWizard。这个名字将被用于显示在New Project List对话框中. 最后一个输入域用来指定定制步进的数目或者对话框的数目,它将被添加到新的定制AppWizard中。有时候我们不需要额外的步进对话框,比如我们即将创建的简单AppWizard就不用任何步进。但在第三部分中,我们将会学习如何定制步进对话框。 接下来,按Next按钮继续到定制AppWizard的第二步(对话框),也是最后一步。这个对话框中有两个域都是自解释的。第一个域定义新定制的AppWizard是个可执行程序还是一个DLL。第二个域指定语言支持选项。 |
设置工程的缺省选项 |
前面我们讲过用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创建的每一个源文件都会自动建立程序员自己的专用注释。 [待续] |