中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > VC环境与编译调试发行
在Visual C++中定制AppWizard (二)
作者:未知 时间:2005-07-20 14:21 出处:VC知识库 责编:chinaitpower
              摘要:在Visual C++中定制AppWizard (二)

 

 

第二部分 创建一个简单的AppWizard

在第一部分中我们介绍了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创建的每一个源文件都会自动建立程序员自己的专用注释。

[待续]

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有