Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9732263
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: 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类负责AppWizardMFCAPWZ.DLL之间的通讯。实际上这种通讯是单边的。MFCAPWZ.DLL告诉你的CCustomAppWiz对象什么时候需要调用相应的虚拟成员函数。

CCustomAppWiz类中大约有十来个函数,其中只有五个函数是可以看到并使用的常用例程。通过这些函数的命名你基本上就能了解其主要作用。例如,InitCustomAppWiz()函数是进行初始化,包括初始化宏。除此之外,ExitCustomAppWiz()函数的作用是卸载AppWizard

另外,还有两个函数用来控制步进对话框的显示顺序。Next()Back()。不说肯定你也知道,这两个函数与AppWizard对话框中的NextBack按钮是关联的。

最后一个很重要的函数是CustomizeProject(),一旦程序员完成工程选项的设置,AppWizard便创建工程的make文件并定义工程缺省的debugrelease配置。然后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创建的每一个源文件都会自动建立程序员自己的专用注释。

[待续]

下载本文示例代码
阅读(2541) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~