敬业的IT人 >> 编程开发 >> C/C++ >> 在Visual C++中定制AppWizard (二)

在Visual C++中定制AppWizard (二)

敬业的IT人 互联网 佚名 2008-1-3 19:45:24

  第二部分 创建一个简单的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 MFCAppWizard 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!
");
  // 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!
");
  // 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创建的每一个源文件都会自动建立程序员自己的专用注释。

进入讨论组讨论。
  • 如何重装xp系统图解
  • 下载Flash播放插件
  • 巧妙清除Windows 2000/XP登录密码
  • 如何利用路由器设置局域网
  • QQ空间打不开
  • 开机后鼠标不动怎么办
  • Excel密码保护的解除方法与解除原理
  • Windows XP注册表详解
  • 3dmax不锈钢金属材质的制作方法
  • 硬盘变成raw格式怎么办

  [待续]

专题:进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com