最近学习wxWidgets,发现要在VS中使用它的话,没有项目向导,生成代码框架。于是,查找各种资料,归纳总结了下,生成此文,本文先介绍VS2008中通常的项目向导生成项目框架的过程,然后说明在这个过程中所使用的各种概念、文件等,最后介绍如何创建wxWidgets的项目向导。各位高手看官轻拍!今天先写第一个部分,以生成“Win32应用程序”为例,简要介绍生成项目框架的整个过程。
一、利用向导创建项目
1 打开“新建项目”,显示项目模板
如上图,当用户点击“新建”—“项目…”菜单项后,VS Shell会在“新建项目”对话框中列出所有已安装的项目模板。主要有以下步骤:
(1)在注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Projects中定位所支持的所有项目类型(“是指VC或VB这些大类”)的项目模板目录。在此项的某些子项(如VC++就是{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}子项)中有名称为ProjectTemplatesDir的字符串值,该值就是存放某项目类型的所有项目向导定义文件的模板目录的地址(如VC++对应的模板目录就是\MicrosoftVisual Studio 9.0\VC\vcprojects),如下图所示:
(2)通过模板目录结构和向导定义文件确定“新建项目”对话框中显示的内容。如下图所示,VS Shell根据模板目录结构确定了“项目类型”框中树形结构;然后,查找并读取向导定义文件(包括目录描述文件(*.vsdir)、向导描述文件(*.vsz)和项目向导图标(*.ico)),以确定“模板”框及下面静态文本框中的信息。
点击“确定”,则可启动项目向导。
2 启动向导引擎,生成向导页面
如前一步,当用户选择了某个项目模板图标,并单击“确定”按钮之后,VS Shell会启动向导引擎,生成项目向导的引导页面。主要有以下步骤:
(1)启动向导引擎;
VS Shell使用.vsz文件中第二行的ProgID(即Wizard=VsWizard.VsWizardEngine.9.0)来创建向导引擎(一个COM对象)。如下图:
(2)定位向导控制文件;
引擎初始化完毕后,将按如下步骤定位向导控制文件(包括UI和脚本文件):
a.向VS Shell查询VS的注册表项。
即(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0)。
b.打开查询得到的注册表项的Setup子项,作为当前注册表项。
c.从.vsz文件中读取符号PROJECT_TYPE的值,如果没有指定则默认为C++项目。对于C++,该值为VCPROJ,向导引擎把它映射到注册表项“VC”,当前注册表项变成(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Setup\VC);对于第三方语言,没有这种自动映射,因此引擎直接在Setup子项下查找PROJECT_TYPE值,把该子项作为当前注册表项。
d. 在当前注册表项(即Setup子项下的VC)下查找ProductDir字符串值,并把该值保存在PRODUCT_INSTALLATION_DIR符号中。如下图:
e.引擎在*.vsz文件中查找参数RELATIVE_PATH或参数ABSOLUTE_PATH。如果找到RELATIVE_PATH,那么它的值被追加到PRODUCT_INSTALLATION_DIR符号的值后,得到的新路径就为向导控制文件所在目录。如果找到的是ABSOLUTE_PATH,那么它的值就是向导控制文件所在目录。如果两个符号都没找到,那么引擎把默认的向导目录VCWizards添加到PRODUCT_INSTALLATION_DIR符号的值后,作为向导控制文件所在目录。
f. 一旦引擎找到向导文件所在目录,它将确定向导文件在哪个子目录中,这是通过.vsz文件中的WIZARD_NAME参数确定的。引擎最终把此子目录保存在符号START_PATH中供向导的后续使用,如上面的例子中,START_PATH=C:\Program Files\Microsoft Visual Studio9.0\VC\VCWizards\AppWiz\Generic\Application。
(3)生成向导页面
在向导引擎初始化完成,读取.vsz文件时,向导引擎就能确认向导是否有UI,这是通过检查.vsz文件中的WIZARD_UI参数来完成的(如果没有设置此参数,则默认有UI)。如果该参数为TRUE或者完成没有指定,那么向导引擎打开一个对话框,并从<START_PATH>\html\<locale>目录中加载主向导HTML页(default.htm),如下图,生成第一个向导页面。
向导模板的界面是由html内嵌于向导框来表现的,HTML页可以链接到其它HTML页。如下两图所示:
3 通过页面交互,生成项目框架
当向导引擎生成向导页面时,通过一个叫做“符号表”的数据结构,定义向导的行为,接受与用户进行的信息交互,生成项目框架,有如下三个方面:
(1)读取.vsz文件参数,定义向导的行为。主要是从.vsz文件读取“Param=”开头的参数,定义向导的行为。
(2)定义向导中要使用的“符号”。可以通过HTML文件的<symbol>标签或者JScript来向符号表中添加新的符号,例如:
<symbol NAME="CUSTOM_SYMBOL_1" TYPE="text"VALUE="My value"></symbol>
或者,
wizard.AddSymbol("CUSTOM_SYMBOL_2", "Anothervalue");
其中,<symbol>标签的TYPE属性有如下几种取值:text、checkbox、radio和bool。
(3)记录用户的UI选择,生成项目框架。在用户进行每个向导页面UI选择的过程中,相应的选择结果会记录到符号表中的对应符号中;当用户单击向导的“完成”按钮时,将最终导致<START_PATH>\scripts\<locale>目录下的default.js中的OnFinish方法被执行。对于“新建项目”向导,OnFinish方法的动作基本上是标准化的:首先创建一个项目,然后在模板目录中读取templates.inf文件,并确定哪些模板需要分析和加入到项目中。基于符号表中的符号集合,对templates.inf中的文件进行有选择地分析、处理,然后添加到项目中。生成项目框架代码的过程比较简单,就是分析templates.inf中列出的文件,然后用项目名称来代替这些文件中需要代替的部分,就得到了项目代码了。