荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: zzt (好好学习,天天向上), 信区: Program
标  题: [转载] MFC四大天王(四)--Dissecting MFC      cudo (转寄)
发信站: BBS 荔园晨风站 (Thu Mar  2 16:10:29 2000), 转信

【 以下文字转载自 zzt 的信箱 】
【 原文由 zhuzutao.bbs@smth.org 所发表 】
发信人: magiceye (世纪末的风), 信区: VisualC
标  题: MFC四大天王(四)--Dissecting MFC
发信站: BBS 水木清华站 (Wed Nov 24 12:31:21 1999)


■Dissecting MFC

作者:侯俊杰
出版公司:松岗
出版日期:1996/10
页数:13 章,778 页
售价:NT$ 860.00。含光碟一片。

第一篇 勿在浮砂 高台 - 技术前提
1. Win32 程式基本观念
2. C++ 的重要性质
3. MFC 六大关键技术之模拟

第二篇 Visual C++ v4.0 开发工具
4. Visual C++ - 整合性软体开发环境

第叁篇 浅出 MFC 程式设计
5. 总观 Application Framework
6. MFC 程式设计导论 - MFC 程式的生与死
7. 一个简单而完整的 MFC 骨干程式

第四篇 深入 MFC 程式设计
8. Document-View 深入探讨
9. 讯息映射与绕行
10. 对话盒与 DDX/DDV
11. View功能之加强与重绘效率之提升
12. 印表与预视
13. 多重文件与多重显示

Appendix A: 从摇篮到坟墓 - Windows 的完全学习
Appendix B: Scribble Step5 程式原始码列表
Appendix C: Visual C++ 所附范例程式一览
Appendix D: OWL 程式设计一览

我谈这本书,可能会被讥以「分身替本尊说话」,但为了举荐好书,以及秉持外举不避
仇、内举不避亲的原则,我不想闪躲。

这本书目前只有中文版。已经有国内出版社积极表达争取出版英文本的意愿。大陆方
面,则有多家出版社亟愿将此书译为简体版,甚至直接 Email 与作者联络。这本就是前
阵子在 BBS 上引起众多讨论的「深入浅出 MFC」,Dissecting MFC。

依我看,本书横亘在 Inside Visual C++ 和 MFC Internals 两书之间,有
InsideVisual C++ 的实用面,而在核心技术更擅胜场。有 MFC Internals 的深入
面,而无其过於晦涩。

所谓核心技术,本书指的是:

1. 应用程式和 MFC framework 的因果关系。这一部份是你学习MFC 程式设计的
成败关键。因为太多人上不了第一个台阶。本书把隐藏的 WinMain 函式、视窗类别注册、
视窗诞生、讯息回路等动作统统挖掘出来,让属於 framework 的那半边曝光,和你的应
用程式码这半边拼兜出一张完整的逻辑脉络图。才不会堆积木老是少一块。

2. 讯息映射(Message Mapping)和命令绕行(Command Routing)。「物件导
向」从来没有考虑过 Windows 讯息(那当然)。MFC 程式有四大类别(application、
frame、document、view),程式员最容易陷入的苦恼是不知道在哪一个类别中拦截并
处理命令讯息。那是因为没有能够看清楚讯息在类别中的流动路线。流动路线的整个地图
隐隐在巍巍山巅:在由 DECLARE_MESSAGE_MAP、BEGIN_MESSAGE_MAP、
END_MESSAGE_MAP 以及其他的 ON_COMMAND、ON_WM_PAINT 等巨集架构起来的巨大
网络中。当你的程式一开始执行,整个 MFC 的绝大部份类别,都已经贡献出一些资料,
组成这张巨幅网络(噢,是的,当然也耗用了你的记忆体)。

3. Document/View/Template 之间的关系。一个程式如果支援两份以上的
Documents,应该如何管理?对应的使用者介面应该如何设定?Document Template 究
竟是何用途?这是这个主题要探讨的题目。

4. Runtime Type Information(RTTI)和 Dynamic Creation。把一份
document 写入档案之中,连同类别名称和成员变数的值,没有问题。是的,一点问题也
没有,但是读出来就有问题了,因为你不可能读一个类别名称到一个字串中然後对这个字
串做 new 动作。「从档案读出类别名称然後产生其物件」,就是 "dynamic creation"
的具体表现。C++ 不支援这项能力,但 MFC 非要不可,因为有太多时候需要 dynamic
creation。其实你只要使用笨方法如下,就可以解决 dynamic creation 的问题:

read ClassName to str
if (str == "Class1")
new Class1;
else if (str == "Class2")
new Class2;
else if (str == "Class3")
new Class3;
else if (str == "Class4")
new Class4;
...

MFC 小组比我们聪明吗?不会。但是他们比我们懂得包装。他们在MFC framework 中
架构起一个由所有类别相关资讯(包括类别名称及建构函式)组成的类别型录网络(一个
串列),然後把类别名称的比对动作埋藏在 Serialize 虚拟函式中。类别型录网络中的
每一个成员就是 CRuntimeClass 物件,网络的组成则是藉由类别宣告时的
DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 巨集完成。RUNTIME_CLASS巨集
就是取出「类别型录网络」中的一个元素(代表一个类别)。所以,当你的程式一开始执行

整个 MFC 的绝大部份类别,都已经放在这个「类别型录网络」之中(噢,是的,当然也
耗用了你的记忆体)。有了这网络,RTTI(执行时期型别辨识)和 Dynamic Creation
都不是问题。

5. Persistence。文件内容要用什麽型式写到档案去,才能够再从档案读出来恢复
为一个个的物件?这就是 persistence(MFC 称之为 serialization)要探讨的题
目。本书把 Serialize 虚拟函式的内部行为全部挖掘出来,并且实际观察一个文件档的
hex 倾印内容。

这五个部份是本书最精华的地方,也是它独步全球的地方。要有这麽深入的了解,非
得观察 MFC 原始码不可。本书把相关的 MFC 码整理出来,加上相当多的示意图,MFC
Internals 虽然挖得更广,整理的功夫却没有这本好。

这本书用词相当精准。用词精准在容易岐路的物件导向领域中至为重要,许多细微的
观念就在字句推敲中成形。

实例方面,希望看到琳琅满目的范例程式的读者,将会大失所望。这本书使用Visual
C++ 的标准范例 Scribble。只有第 13 章「多重文件与多重显示」中才有作者自己设
计的程式。然而以Scribble 为范例主轴,有一个意想不到的好处:常看 Microsoft
Systems Journal 或 Windows Developer's Journal 的朋友就知道,许多作家
喜欢在示范新技术或新构想时,以 Scribble 为载具。如果你对Scribble 十分熟悉,
阅读那些文章可就驾轻就熟了。

本书的许多精心插图,是令人惊喜的地方。一图解千言万语,在这里获得最佳注脚。

我偷窥了一封读者写给本书作者的信,信上这麽说:『当我在书店中驻足察看这本书五
分钟之後,我便知道这本书是一定要买下的。我一鼓作气将这本书给读完了,而且是彻彻
底底地读了两遍。...我个人特别喜欢第叁章:MFC 六大关键技术之模拟。这章内容的设
计的确是要在 MFC 丛林中,大刀阔斧地披露出最重要的筋络,我相信这正是所有学习 MFC
的人所需要的一种表明方式。对我而言,以往遗留的许多疑惑,在此都一一得到了解答。
最重要的是,您曾在说到,学习 MFC 的过程中最重要的莫过於自我审视 MFC 程式码的
能力。很高兴地,在我看完本书之後,我确实比以前更有能力来看 MFC原始码了。总之,
我为自己能够更深入了解 MFC 而要向你说声谢谢。』

作者因为这封令人感动的信,当天又多熬夜叁个小时。不要问我是怎麽知道的 :-)。

--
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 210.32.132.191]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.11]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店