深入浅出MFC第2版(PDF格式)-第156部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
整个Top Studio AppWizard (以及其它所有的custom AppWizard )的主类别系衍生自系
统提供的CCustomAppWiz :
// in Top StudioAw。h
class CTopStudioAppWiz : public CCustomAppWiz
{
。。。。
};
// in 〃Top StudioAw。cpp〃
CTopStudioAppWiz TopStudioaw; //类似application object。
//对象命名规则是〃项目名称〃 + 〃aw〃。
你不会在MFC 类别架构档中发现CCustomAppWiz ,它是Visual C++ 的mfcapwz。dll
所提供的一个类别。此类别拥有一个CMapStringToString 对象,名为m_Dictionary,所
以TopStudioaw 自然就继承了m_Dictionary。这便是储存macros 定义的地方。我们可
以利用TopStudioaw。m_Dictionary'xxx' = xxx 的方式来加入一个个的macros 。
现在,改写OnDismiss 虚拟函数如下:
#0001 // This is called whenever the user presses Next; Back; or Finish with this step
#0002 // present。 Do all validation & data exchange from the dialog in this function。
#0003 BOOL CCustom1Dlg::OnDismiss()
#0004 {
#0005 if (!UpdateData(TRUE))
#0006 return FALSE;
#0007
#0008 if( m_szAuthor。IsEmpty() == FALSE )
#0009 TopStudioaw。m_Dictionary'〃PROJ_AUTHOR〃' = m_szAuthor;
#0010 else
787
…………………………………………………………Page 850……………………………………………………………
第篇 深入 MFC 程式設計
#0011 TopStudioaw。m_Dictionary'〃PROJ_AUTHOR〃' = 〃〃;
#0012
#0013 if( m_szment。IsEmpty() == FALSE )
#0014 TopStudioaw。m_Dictionary'〃PROJ_MENT〃' = m_szment;
#0015 else
#0016 TopStudioaw。m_Dictionary'〃PROJ_MENT〃' = 〃〃;
#0017
#0018 CTime date = CTime::GetCurrentTime();
#0019 CString szDate = date。Format( 〃%A; %B %d; %Y〃 );
#0020 TopStudioaw。m_Dictionary'〃PROJ_DATE〃' = szDate;
#0021
#0022 return TRUE; // return FALSE if the dialog shouldn't be dismissed
#0023 }
这么一来我们就定义了三个macros :
macro 名称 macro 内容
PROJ_AUTHOR m_szAuthor
PROJ_DATE szDate
PROJ_MENT m_szment
修改 text template
现在,为Top Studio AppWizard 的template 子目录中的每一个。H 档和。CPP 档增加
一小段码,放在文件最前端:
/*
This project was created using the Top Studio AppWizard
PROJ_MENT
Project: Root
Author : PROJ_AUTHOR
Date : PROJ_DATE
*/
788
…………………………………………………………Page 851……………………………………………………………
15 AppWizard
第 章 定製個
Top Studio AppWizard执行结果
重新编译联结,然后使用Top Studio AppWizard 产生一个项目。第7个步骤的画面如下:
由Top Studio AppWizard 产生出来的程序代码中,每一个。CPP 和。H 档最前面果然有
下面数行文字,大功告成。
789
…………………………………………………………Page 852……………………………………………………………
第篇 深入 MFC 程式設計
更多的信息
我在本章中只是简单示范了一下「继承自原有之Wizard ,再添加新功能」的作法。这该
算是半自助吧。全自助的作法就复杂许多。Walter Oney 有一篇〃Pay No Attention to the
Man Behind the Curtain! Write Your Own C++ AppWizards〃 文章,发表于Microsoft
Systems Journal 的1997 三月号,里面详细描述了全自助的作法。请注意,他是以Visual
C++ 4。2 为演练对象。不过,除了画面不同,技术上完全适用于Visual C++ 5。0 。
Dino Esposito 有一篇文章〃a new assistant〃,发表于Windows Tech Journal 的1997 三
月号,也值得参考。1997 年五月份的Dr。 Dobb's Journal 也有一篇名为〃Extending
Visual C++ : Custom AppWizards make it possible〃 的文章,作者是John Roberts 。
790
…………………………………………………………Page 853……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
第16 章
站上众人的肩膀 使用
ponents & ActiveX Controls
从Visual Basic 开始,可以说一个以ponents (软件组件)为中心的程序设计时代,
逐渐拉开了序幕。随后Delphi 和C++ Builder 陆续登场。Visual Basic 使用VBX (Visual
Basic eXtension )组件,Delphi 和C++ Builder 使用VCL (Visual ponent Library )
组件,Visual C++ 则使用OCX (OLE Control eXtension )组件。如今OCX 又演化到所
谓ActiveX 组件(其实和OCX 大同小异)。
Microsoft 的Visual Basic (使用Basic 语言),Borland 的Delphi (使用Pascal 语言),
以及 Borland 的 C++ Builder (使用 C++ 语言),都称得上是一种快速开发工具 (RAD,
)
Rapid Application Development )。它们所使用的组件都是PME (Properties…Method…Event
架构。这使得它们的整合环境(IDE)能够做出非常可视化的开发工具,以拖放、填单的
方式完成绝大部份的程序设计工作。它们的应用程序开发程序大约是这个样子:
1。 选择一些适当的软件组件(VBX 或VCL )。
2。 打开一个form,把那些软件组件拖放到form 中适当的位置。
3。 在Properties 清单中填写适当的属性。例如精确位置、宽度高度、或是让A组件的
某个属性连接到B组件。。。等等。
4。 撰写程序代码(method ),做为某种event 发生时的处理例程。
791
…………………………………………………………Page 854……………………………………………………………
第篇 深入 MFC 程式設計
依我的看法,Visual C++ 还不能够算是RAD 。虽然,MFC 程序所能够使用的OCX 也
是PME (Properties…Method…Event )架构,但Visual C++ 整合环境没有能够提供适当工
具让我们以那么可视化的方式(像VB 或Delphi 或C++ Builder 那样拖放、填单)就
几乎完成一个程序。
什么是ponent Gallery
ponent Gallery 是自从Visual C++ 4。0 之后,整合环境中新增的一个东西。你可以把
它想象成一个数据库,储存着ActiveX controls 和可重复使用的C++ 类别(也就是本章
所谓的ponents )。VC++ 5。0 的ponent Gallery 的使用接口和VC++ 4。x 有某种
程度的不同,不过操控原则基本上是一致的。
当你安装了Visual C++ 5。0 ,ponent Gallery 已经内含了一些微软所提供的
ponents 和ActiveX controls (注:以下我将把这两样东西统称为「组件」)。选按整
合环境的【Project / Add To Project / ponents and Controls。。。 】菜单项目,你就可以看到
ponent Gallery :
792
…………………………………………………………Page 855……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
其中有Developer Studio ponents 和Registered ActiveX Controls 两个资料夹,打开任
何一个,就会出现目前系统所拥有的「货色」:
如果你以为这些组件储存在两个地方(一个是它本来的位置,另一份拷贝放在ponent
Gallery 之中),那你就错了。ponent Gallery 只是存放那些组件的位置资料而已。你
可以说,只是存放一个「联结」而已。
为什么组件在此分为ponents 和ActiveX controls 两种?有什么不同。简单地说,
ponents 是一些已写好的C++ 类别。基本上C++ 类别本来就具有重复使用性,
ponent Gallery 只是把它们多做一些必要的包装,连同其它资源放在一起成为一个包
裹。当你需要某个ponent ,ponent Gallery 给你的是该ponents 的源代码。
ActiveX controls 不一样。当你选用某个ActiveX controls ,ponent Gallery 当然也会为
你填入一些码,但它们不是组件的本体。那些码只是使用组件时所必须的码,组件本身
在。OCX 文件中(通常注册后的OCX 文件都放在WindowsSystem 磁盘子目录)。
793
…………………………………………………………Page 856……………………………………………………………
第篇 深入 MFC 程式設計
ActiveX controls 是很完整的一个有着PME (Proterties…Method…Event )架构的控制组件,
但一般欲被重复使用的C++ 类别却不会有那么完整的设计或包装。要把一个C++ 类别
做成完好的包装,放到ponent Gallery 中,它必须变为一个单一文件,内含类别资
讯以及任何必须的资源。这在过去的Visual C++ 4。x 中是很容易的事情,因为每次你使
用ClassWizard 新增一个类别,就有一个核示盒询问你要不要加到ponent Gallery :
Visual C++ 4。x 的ClassWizard 新增类别对话窗
但这一选项已在Visual C++ 5。0 中拿掉(你可以在第10 章增加对话窗类别时看到新的画
面)。看来似乎要增加ponents 不再是那么方便了。这倒也不是坏事,我想许多人
在设计程序时忽略了上图那个选项,于是每一个项目中的每一个类别,都被包装到
ponent Gallery 去,而其中许多根本是没有价值的:
794
…………………………………………………………Page 857……………………………………………………………
16 ponents & ActiveX Controls
第 章 站眾的肩膀 使用
Visual C++ 4。x 的ponent Gallery。常常因为程序员的疏忽,而产生了
一大堆没有价值的ponents。
使用 ponents
当你选择ponent Gallery 中的Developer Studio ponents 资料夹,出现许多的
ponents 。面对形形色色的「货」,你的心里一定嘀咕着:怎么用嘛?幸好画面上有