(未完待续。。。)
第15章 定制一个 AppWizard 产生新的「程序代码产生器」
注:
①DUMPBIN.EXE工具的位置:
VC++5.0的\DevStudio\SharedIDE\BIN\IDE\对应VC++6.0的MVS\VC98\Bin\
②下面的目录提供用户定义的AWX文件存放位置:
VC++5.0的\DevStudio\SharedIDE\Template对应VC++6.0的MVS\Common\MSDev98\Template
③Visual C++ 系统中早已存在有一些.AWX档了
VC++5.0系统的.AWX可能是在\DevStudio\SharedIDE\BIN\IDE\中,找到5个AWX文件
VC++6.0系统的.AWX可能是在\Common\MSDev98\Bin\IDE中,找到13个AWX文件和24个HLP文件
1.MFC AppWizard以「程序代码产生器」的身份,自动做出「骨干程序」。(内建的程序类型)
用于定制AppWizard。(任何自定程序类型)
2.Wizard的本质:AWX文件,Application Wizard eXtension (32位的MFC extension DLL)
Developer's Studio提供了一个开放的AppWizard接口(一组类别和一些组件),产生AWX文件
必须被放置于中\DevStudio\SharedIDE\Template被VC++的"project manager"会检查,
并将"template"显示其图标于【New Project】对话窗中,供使用者选择。
Wizard 本身是一个所谓的「template 直译器」。这里所谓的"template" 是一些文字文件,内有许多特殊符号(也就是本章稍后要介绍的macros 和directives )。Wizard 读取这些template ,对于正常文字,就以正常的output stream 输出到另一个文件中;对于特殊符号或保留字,就解析它们然后再把结果以一般的output stream 输出到文件中。Wizard 所显示给使用者看的「步骤对话窗」可以接受使用者的指定项目或文字输出,于是会影响template 中的特殊符号的内容或解析,连带也就影响了Wizard 的stream 输出。这些stream 输出,最后就成为你的项目的源文件。
3.「订制型AppWizard」的产生:
Custom AppWizard | Standard MFC AppWizard steps(1) | MFC Exe
根据MFC AppWizard为它加上额外的几个步骤,成为一个「订制型AppWizard」。
其他方式:
An existing project:根据一个原已存在的项目档(*.dsp)来产生一个「订制型AppWizard」
Your own custom steps:有全新的步骤和全新的对话窗画面。最大弹性最困难的一种作法
生成的文件自动复制到\DevStudio\SharedIDE\Template中一份
整合环境的【File/New 】,在【Projects】对话窗中新的「订制型AppWizard 」出现了:
5.关于Custom Dialog Classes和Custom Dialog Resources(Dialog templates)
由于多出一个对话窗画面,必需要产生一个对话框模板(template),还要为这模板产生一个对应的C++类别,并以DDX/DDV取得「使用者的输入资料」放置到「程序代码产生器」所产生的项目源代码中。
程序代码产生器会读取.AWX 档,做出适当的源代码来。
6.有许多所谓的macros 和directives 存在于"text template"
①macro 是用来代表一个常数。前后以$$ 包夹起来的字符串即为一个macro 名称。
②directives是用来控制text templates 中的流程。字符串前面如果以$$ 开头即为一个directive。
$$IF $$ELIF $$ELSE $$ENDIF
$$BEGINLOOP $$ENDLOOP
$$SET_DEFAULT_LANG $$// $$INCLUDE
7.以原本的MFC AppWizard(exe)为基础,加上第7个步骤,让程序员填入姓名、简易说明,然后利用「订制型AppWizard 」就能够把这些资料加到每一个源代码文件最前端。
①利用资源编辑器修改IDD_CUSTOM1对话窗画面
②利用ClassWizard 修改IDD_CUSTOM1对话窗的对应类别CCustom1Dlg
控制组件的类型、ID、对应的变量名称:
IDC_EDIT_AUTHOR m_szAuthor Value CString
IDC_EDIT_COMMENT m_szComment Value CString
③CCustom1Dlg衍生自CAppWizStepDlg,它是Visual C++的mfcapwz.dll所提供的一个类别。此类别有一个虚拟函数OnDismiss,当AppWizard 的使用者选按【Back】或【Next 】或【Finish】钮时就会被唤起。如果它传回TRUE。在这个函数中做数值检验的工作,更重要的是做macros 的设定工作。
CXxxxAppWiz衍生自CCustomAppWiz,它是Visual C++的mfcapwz.dll所提供的一个类别。此类别拥有一个CMapStringToString对象,利用Xxxxaw.m_Dictionary[xxx] = xxx的方式来加入一个个的macros
在类的源文件中:CXxxxAppWiz Xxxxaw;//定义全局对象
④改写CCustom1Dlg::OnDismiss():
if (!UpdateData(TRUE))
return FALSE;
if( m_szAuthor.IsEmpty() == FALSE )
Xxxxaw.m_Dictionary["PROJ_AUTHOR"] = m_szAuthor;//PROJ_AUTHOR m_szAuthor
else
Xxxxaw.m_Dictionary["PROJ_AUTHOR"] = "";
if( m_szComment.IsEmpty() == FALSE )
Xxxxaw.m_Dictionary["PROJ_COMMENT"] = m_szComment;//PROJ_COMMENT m_szComment
else
Xxxxaw.m_Dictionary["PROJ_COMMENT"] = "";
CTime date = CTime::GetCurrentTime();
CString szDate = date.Format( "%A, %B %d, %Y" );
Xxxxaw.m_Dictionary["PROJ_DATE"] = szDate;//PROJ_DATE szDate
return TRUE; // return FALSE if the dialog shouldn't be dismissed
⑤修改text template:在template子目录中的每一个.H 档和.CPP 档增加一小段码,放在文件最前端:
/*This project was created using the Xxxx AppWizard
$$PROJ_COMMENT$$
Project: $$Root$$ Author : $$PROJ_AUTHOR$$ Date : $$PROJ_DATE$$ */
第16章 站上众人的肩膀- 使用Components和ActiveX Controls
//
从Visual Basic 开始,可以说一个以components (软件组件)为中心的程序设计时代,逐渐拉开了序幕。随后Delphi 和C++ Builder 陆续登场
Microsoft 的Visual Basic(使用Basic语言),使用VBX(VisualBasic eXtension)组件。
Borland的Delphi(使用Pascal语言),使用VCL (Visual Component Library )组件
Borland的C++ Builder(使用 C++语言),使用VCL (Visual Component Library )组件
都称得上是一种快速开发工具(RAD,Rapid Application Development)。它们所使用的组件都是PME(Properties-Method-Event)架构。这使得它们的整合环境(IDE)能够做出非常可视化的开发工具,以拖放、填单的方式完成绝大部份的程序设计工作。
1. 选择一些适当的软件组件(VBX 或VCL )。
2. 打开一个form ,把那些软件组件拖放到form 中适当的位置。
3. 在Properties 清单中填写属性。例如精确位置、宽度高度、让A组件的某个属性连接到B组件等等。
4. 撰写程序代码(method),做为某种event 发生时的处理例程。
Visual C++ 则使用OCX(OLE Control eXtension)组件。还不能够算是RAD。
如今OCX 又演化到所谓ActiveX 组件(其实和OCX 大同小异,OCX 就是ActiveX Control!由于微软把它所有的Internet 技术都称为ActiveX,所以OLE Controls 就变成了ActiveX Controls)。
Component Gallery 是自从Visual C++ 4.0 之后,整合环境中新增的一个东西。实际只是存放那些组件的位置资料而已。(其中的两个文件夹内容的区别)
Components 是具有重复使用性的C++类别,是该组件的源代码。
只是多做了必要的包装,连同其它资源放在一起成为一个包裹。
ActiveX controls 是由Component Gallery 填入一些码,但它们不是组件的本体。那些码只是使用组件时所必须的码,组件本身在.OCX文件中(通常注册后的OCX 文件都放在Windows\System 磁盘子目录)。
1. 建立新项目时,在AppWizard 的步骤3中选择【ActiveX Controls】。这会使程序代码多出一行:
BOOL COcxTestApp::InitInstance(){
AfxEnableControlContainer();
...}
2. 进入Component Gallery ,把ActiveX Controls 安插到你的程序中。
3. 使用ActiveX Controls。通常我们在对话窗中使用它。我们可以把资源编辑器的工具箱里头的ActiveX Controls 拖放到目标对话窗中。
4. 利用ClassWizard 产生对话窗类别,并处理相关的Message Maps、消息处理例程、变量定义、对话框函数等。
5. 编译联结。