在Visual C++中定制AppWizard (三)
2010-07-25 20:46:40 来源:WEB开发网IDC_STATIC_ICON、IDC_STATIC_TEXT、IDC_STATIC_MAIL、IDB_STATIC_IMG是“关于”对话框中要用到的四个控制,它们是在Dlgres.h和resource.h中定义的,稍候我们在修改资源模板文件时会定义这四个控制ID。
About.h的代码中包含了OnInitDialog()处理。当它被调用时,做一些控制的初始化。接下来我们要做的事情是把模板添加到工程中。
前面我们讲过,Custom AppWizard创建新工程的时候,由MFCAPWZ.DLL负责用模板文件来生成新工程的源文件。那么如何告诉AppWizard除了要产生默认的源文件以外,你还要求创建一个新模板文件呢?实际上,要解决这个问题需要两个步骤。第一步,你必须更新资源文件,在创建新工程时,将自定义资源插入到每一个Custom AppWizard创建的文件中。为此,必须以文本模式打开.rc文件,定位到下面注释的位置:
//TEMPLATE
你应该看到这个注释行的后面列出了所有模板文件,它们都是定制AppWizard要用来生成新工程源文件的模板。我们要在其中加入一个新的模板文件——About.h,将下面这几行代码加到模板文件清单中:
//
ABOUT.H TEMPLATE DISCARDABLE "template\about.h"
VCKBASELOGO.BMP TEMPLATE DISCARDABLE "template\vckbaselogo.bmp"
HYPRLINK.H TEMPLATE DISCARDABLE "template\HyprLink.h"
STATLINK.H TEMPLATE DISCARDABLE "template\StatLink.h"
STATLINK.CPP TEMPLATE DISCARDABLE "template\StatLink.cpp"
//
这里hyprlink.h、statlink.h、statlink.cpp三个文件是超链接类,它是由MSDN 专栏作家Paul Dilascia 编写的可重用类,很多读者一定熟悉Paul 在MSDN的专栏——《C++ Q&A》,他的大多数文章的示例代码都用到这个类在“关于”对话框中创建静态超链接。笔者深受启发,在VC知识库中也多次使用这个类来做Demo程序的“关于”对话框。但每次做都要去重复定制“关于”对话框岂不是很累。所以才决定做一个自己的AppWizard。 下一步,我们的任务是修改newproj.inf文件
修改newproj.inf文件
这个文件乍一看有点怪模怪样,它位于AppWizard工程的Template目录。在创建新的工程文件时,MFCAPWZ.DLL需要用到这个文件。前面我们提到过占位符,它以“$$”作为前缀和后缀,并且它与AppWizard宏的名字相关联,宏名所对应的宏的值存储在Dictionary字典中。除此之外,“$$”也被用于表示某种命令——这些命令被称为AppWizard指令,它们被用于处理模板文件。 Newproj.inf中的第一行指令是注释行,用“$$//”表示,这四个字符后的任何文本都被MFCAPWZ.DLL忽略,不予解析。打开newproj.inf文件,其第一行就是:
$$// newproj.inf = template for list of template files
通常在一个模板文件被转换为新工程中的源文件时,宏的作用是命名目的文件。但是,某些标准文件的名字与所建工程类型无关,不管创建什么样的工程,其名字都是一样的。例如:stdafx.h和stdafx..cpp。下面的代码行告诉MFCAPWZ.DLL将stdafx.h和stdafx.cpp文件拷到新工程文件夹,文件名不变。这里要注意两个文件名(模板文件和目的文件)之间使用一个Tab键分开,这一点很重要,而且经常被忽略。如果你是手工编写此代码行,必须保证两个文件之间只能是一个Tab,不能是别的任何字符。 stdafx.h StdAfx.h stdafx.cpp StdAfx.cpp newproj.inf文件中的下一条指令是$$IF。它检查括弧中宏的布尔状态。注意这里宏的使用方法,$$IF中用的不是宏本身,换句话说,如果你想在代码中引用宏的话,必须加上前缀和后缀$$,如$$PROGRAMMER$$。 参见下面的代码段,其前两行表示的意义是:如果此工程不是DLL并且不是基于对话框的程序,则将模板文件Frame.h和Frame.cpp拷贝成名字为frame_hfile 和frame_ifile宏所表示的文件名。你可能还记得用AppWizard创建MDI程序时最后一个对话框可以让你根据不同的类命名文件,因为程序员可以改变这些类的名字,其对应的值存储在宏中。这个对话框就象我们在前面定制对话框那样,使用输入对话框的文件名并更新Dictionary字典中的宏。请看一下代码如何命名目的文件:
$$IF(!PROJTYPE_DLL)
$$IF(!PROJTYPE_DLG)
frame.h $$frame_hfile$$.h
frame.cpp $$frame_ifile$$.cpp
下面的$$IF指令和前面的两个$$IF的作用一样,唯一不同的是根据这个宏判断的结果导致另一个从模板到文件的拷贝。
$$IF(MDICHILD)
childfrm.h $$child_frame_hfile$$.h
childfrm.cpp $$child_frame_ifile$$.cpp
最后,每一个$$IF指令都必须有匹配的$$ENDIF指令。此外,指令行末尾可以加入类似C++的注释,如:
$$ENDIF //MDICHILD
$$ENDIF //!PROJTYPE_DLG
- ››Visual Basic 2008 数学函数
- ››Visual Studio2005中Smart Device的问题
- ››Visual Studio 中根据数据库字段动态生成控件
- ››Visual Studio 11全新黑色主题
- ››Visual Studio 2011 Beta新特性(一):安装VS201...
- ››Visual Studio自定义调试窗体两个小技巧
- ››Visual Studio 2005 Team Edition for Database P...
- ››Visual C#两分钟搭建BHO IE钩子
- ››Visual C++优化对大型数据集合的并发访问
- ››定制个性化的对话框窗口类
- ››VISUAL C++中的OCX控件的使用方法
- ››Visual C++实现视频图像处理技术
更多精彩
赞助商链接