MFC 4 大天王

>>>  名人論史——近當代作家的史學觀點  >>> 簡體     傳統

RunPC 1997.02 无责任书评

於 MFC 这一主题,
在「沧海书讯」版上曾经被讨论过的书籍有四本,
正是我所列出的这四大天王。
看来我心目中的好书颇能吻合市场的反应。


我还记得,无责任书评是在四年前(1993)开春时和大家第一次见面。虽然不是每个月都出货,但断断续续总保持着讯息。在明确宣布的情况下这个专栏曾经停过两次,第一次停了三个月,於 1994 年开春复工;第二次停了十五个月,於 1997 年开春的今天,重新与各位说哈罗。

休息整整一个年头又三个月,写作上的疲倦固然是因素之一,另外也是因为这个专栏直接间接引起的让人意兴阑珊的俗人俗务。读者写信来说,『总把无责任书评当成休闲散文看。或许您可以考虑写些休闲小品,定会畅销』,是呀,我正构思把因这个专栏而获得的人生经验写成一本「现形记」。可是不知道手上「正当」工作什麽时间才能告一段落,写起我的小说。也不知道什麽样的出版社有兴趣侯捷写的小说。

倦勤与无奈过去了,满腔读书心得沛然欲发。所以,我又拿起笔「无责任」了。感觉有点陌生,但是回顾读者们这一年写来的上百封信,让我意气昂扬。这个月我谈的是 Visual C++ 与 MFC。此题目我已提过两次。一来它十分重要,演化的过程也十分快速而明显,二来这个领域又有一些重量级书籍出现,所以我必须再谈一次。

另外,我还是得再强调,侯捷的专长领域有限,离我火力太远的书我只能远观不敢近玩。这个专栏用在抛砖引玉,让谈书成为一种风气。Windows Developer's Journal(WDJ)的 Books in Brief 专栏原先也是主持人 Ron Burk 唱独角戏,後来(现在)就有了许多读者的互动。我也希望这样的事情在这里发生。

●必也正名乎

常在 BBS 的程式设计相关版面上看到,许多人把 Visual C++ 和 C++ 混淆不清,另则是把 Visual C++ 和 MFC 混为一谈,实在有必要做个厘清。C++ 是语言,Visual C++ 是产品。『我们学校开了一门 Visual C++ 的课程』这种说法就有点奇怪,实际意义是『我们学校开了一门 C++ 课程,以 Visual C++ 为软体开发环境』。『我会写 Visual C++ 程式』这种说法也很怪,因为Visual C++ 是 C/C++ 编译器,你可以在这套整合开发环境中使用 C 语言或 C++ 语言写出 DOS 程式或 Windows 程式;如果是 Windows 程式,还可以分为 Windows API programming 或MFC programming。所以「我会写 Visual C++ 程式」表达不出你真正的程度和意思。

Visual C++ 是一套 C/C++ 编译器产品,内含一套整合开发环境(Integrated Development Environment,IDE),也就是 AppWizard、ClassWizard、编译器、联结器、资源编辑器等工具的大集合。你知道,真正的 C++ 程式(而不是披着 C++ 外衣的C 程式)是以一个个类别(class)堆砌起来的,为了节省程式员的负担,几乎每一家编译器厂商都会提供一套现成的类别库(class libraries),让程式员站在这个基础开发应用软体。MFC 就是这样一套类别库。如果以物件导向的严格眼光来看,MFC 是比类别库更高一级的所谓 application framework。PC 上另两套与 MFC 同等地位的产品是 Borland 的 OWL 和IBM 的 OpenClass,前者搭配的开发环境是 Borland C++,後者搭配的是 VisualAge C++。其他的 C++ 编译器大厂如Watcom 和 Symantec 和 Metaware,并没有开发自己的类别库,他们向微软取得 MFC 的使用授权,提供 MFC 的原始码、含入档、相容的编译器和联结器。噢是的,他们要求授权的对象是 MFC,而不是 OWL,这就多少说明了 MFC 和 OWL 的市场占有率。

产品名称 厂商 application framework
Visual C++ Microsoft MFC
Borland C++ Borland OWL(最新版据说也提供 MFC)
VisualAge C++ IBM OpenClass
Symantec C++ Symantec MFC


●沧海书讯

清大 BBS 站台(枫挢驿站,IP 位址为 140.114.87.5),在「分类讨论区」的「电脑与资讯」区之下,有一个「沧海书讯」版,对电脑书籍有兴趣的朋友可以去看看。这里并没有(还没有)类似正规书评之类的文章出现,比较多的是读者们对於坊间书籍的阅後感,以及新鲜读者的求助函(找某一主题的好书啦、谁要卖书啦、谁要买书啦等等)。

关於 MFC 这一主题,在沧海书讯版上曾经被讨论过的书籍有四本,正是我所列出的这四大天王。看来我心目中的好书颇能吻合市场反应。这四本书各有特点,色彩鲜明,统统值得收藏。

●四大天王

一本书能够有被收藏的价值,可不简单唷,我不能乱说嘴。诸君,看看我列的理由吧。这四大天王是:

◎Inside Visual C++ 4.0

在四大天王中本书名列老大哥,我这麽排名和天王的「色艺」无关,敬老尊贤的成份多一些。它已是同一本书的第三版,所以才会在书名冠上软体版本号码(上一版名为 Inside Visual C++ 1.5)。书名冠上软体版本号码的另一个因素是,本书在教导我们开发程式时,是 "tool-oriented"(以工具为导向),你会看到像「先按下这个钮,然後填写这一小段码,然後在清单中选择这一项,再回到右边的视窗上...」这样的文字说明,所以 Visual C++ 的版本更迭攸关全书内容。

这就引出了本书在程式诱导方面的一个特徵:工具的使用占了相当吃重的角色。工具的使用难度不高,但非常繁多(从 Visual C++ 新鲜人的眼光看可能是...呃...非常杂乱)。又要学习 MFC,又要配合工具的使用,对初学者而言是双倍负担。我曾经在 BBS 上看到一封信,抱怨 Inside Visual C++ 虽是名着,他却完全看不懂。呵,我完全能够了解 -- 我不是那种自己懂了之後就忘记痛苦的人。

入选原因:老字号,范例程式内容丰富,220 页的 OLE 和 110 页的 Database 是本地唯有的大独家,别处找不到。

◎Programming Windows 95 with MFC

Ray Duncan(侯捷极为尊敬的一位老牌作家,近年似乎淡出,没有什麽新作品)曾经说,这本书是 "the Petzold for MFC programming",俨然有 Petzold()接班人之势。从其主题的安排,甚至从书籍封面的安排,在在显示「接班人」的讯息。而它的内容可以证明Ray Duncan 的推荐并不虚佞。

:Charles Petzold 是 "Programming Windows 95" 一书的作者。该书是SDK 程式设计宝典。这本书近来没有那麽轰动以及人手一册了,因为 MFC 或 OWL 这类 framework 产品不断精进,Delphi、C++Builder 这类快速程式开发工具(Rapid Application Development,RAD)不断进逼,SDK 程式设计的角色有点像组合语言了。不过我告诉你,学会它,绝对让你层次不同 -- 不只在程式设计的层次,还在对作业系统的了解层次。

这本书在程式设计的诱导方面,与 Inside Visual C++ 一书有极大的作法差异。本书没有任何一个程式以 Wizards 完成(我想作者必然曾经借重工具,只是最後再清理一遍),所以你不会看到像 //{{ 和 }}// 这样的奇怪符号,以及一堆 #ifdef、#undef、#endif。「程式码是我们自己一行一行写出来」的这种印象,可能对於消除初学者的焦灼有点帮助。

入选原因:文字简易,观念清楚。从章节目录上你看不到非常特殊的主题,但隐含在各个小节之中有不少珠玉之言。平实稳健。对 MFC 核心观念如 Document/View、Message Map 的讨论虽然浅尝即止,但表现不俗。

◎MFC Internals

这是四大天王之中唯一不以教导 MFC 程式设计为目的的书。它的目的是挖掘 MFC 的黑箱作业内容,从而让读者对application framework 有透彻的认识。这样的认识对於 MFC 的应用面其实也是有帮助的,而且不小。
这本书挖掘 MFC 的原始码至深至多,最後还在附录A列出MFC 原始码的搜寻导引。由於解释 MFC 的内部运作原理,少不得就有一长串的「谁呼叫谁,谁又呼叫谁」的叙述。这种叙述是安眠药的最佳药引,所幸作者大多能够适时地补上一张流程图,对於读者的意识恢复有莫大帮助。

入选原因:独特而唯一。虽然并非初学者乃至中级程度者所能一窥堂奥,
却是所有资深的 MFC 程式员应该尝试读一读的书籍。

◎Dissecting MFC

这本书是应用面(各种 MFC classes 之应用)和核心面(隐藏在 MFC 内的各种奇妙机制)的巧妙混合。前一半篇幅为读者扎基础,包括 Win32、C++、MFC 程式的基础技术环节。後一半篇幅以着名的 Scribble 程式(随附於 Visual C++ 之中)为例,从应用面出发,却以深掘原理的核心技术面收场。看不到丰富绚丽的各种应用技巧,着重在厚植读者对於 MFC 核心技术的基础。

入选原因:本书挖掘的 Runtime Class、Dynamic Creation、Message Mapping、Command Routing、Persistence 等主题,解说详实图片精采,拥有世界级水准。SDK 程式员如果想进入 MFC 领域,这本书是最佳选择。看过 Inside Visual C++ 和 Programming Windows 95 with MFC 的读者,这本书会让你更上层楼,「知其然并知其所以然」。

 

Inside Visual C++ 4.0

作者:David J. Kruglinski
出版公司:Microsoft Press
出版日期:1996 年初
页数:29 章,896 页
售价:US$ 45.00。含光碟一片。

PartI:Windows、Visual C++、and Application Framework Foundamentals
1. Microsoft Windows and Visual C++
2. The MFC Application Framework
PartII:The MFC Library View Class
3. Getting Started wwwith AppWizard - Hello World!
4. Basic Event Handling, Mapping Modes, and a Scrolling View
5. The Graphics Device Interface (GDI), Colors, and Fonts
6. The Modal Dialog and Windows 95 Common Controls
7. The Modeless Dialog and Windows 95 Common Dialogs
8. Using OLE Controls (OCXs)
9. Win32 Memory Management
10. Bitmaps
11. Windows Message Processing and Multithreaded Programming
PartIII:The Document-View Architecture
12. Menus, Keyborad Accelerators, the Rich Edit Control, and Property Sheets
13. Toolbars and Status Bars
14. A Reusable Frame Window Base Class
15. Separating the Document from Its View
16. Reading and Writing Documents - SDI
17. Reading and Writing Documents - MDI
18. Printing and Print Preview
19. Splitter Windows and Multiple Views
20. Context-Senssitive Help
21. Dynamic LInk Libraries (DLLs)
22. MFC Programs Without Document or View Classes
PartIV:OLE
23. The OLE Component Object Model (COM)
24. OLE Automation
25. OLE Uniform Data Transfer - Clipboard Transfer and Drag and Drop
26. OLE Structure Storage
27. OLE Embedded Servers and Containers
PartIV:Database Management
28. Database Management with Microsoft ODBC
29. Database Management with Microsoft Data Access Object (DAO)
Appendix A: A Crash Course in the C++ Language
Appendix B: Message Map Functions in MFC
Appendix C: MFC Library Runtime Class Identification and Dynamic Object Creation

insidevcv3.jpg (17641 bytes)


自从 application framework 兴起,在 raw API 程式设计之外,Windows 程式员又找到了一条新的途径。MFC「系出名门,血统纯正」,比之其他的 application framework 产品自然是声势浩大,MFC 书籍也就因此比其他同等级产品的书籍来得多得多。

群雄并起之势维持没有太久,真正的好东西很快就头角峥嵘了。Inside Visual C++ 是最早出线的一本。此书至今已是第三版,前两版分别针对 MFC 2.0(Visual C++ 1.0)和 MFC 2.5 (Visual C++ 1.5)撰写。已有评论把此书与 Programming Windows 并提,称之为 MFC/C++ 中的 Petzold 书籍(听起来犹如表界中的劳斯莱斯,车界中的劳力士)。Kruglinski 本人为了卡住这个尊崇的位置,甚至「於数年前的一个冬天,有着风雪的傍晚,冒险进入纽约的 East Village,拜访 Windows 大师 Charles Petzold,问他关於撰写 Programming Windows 的想法...」(语见本书之 Introduction 部份)。

Kruglinski 毫不隐藏他对 MFC 的热爱,他说这是他等了十年才盼到的软体开发环境。十年有点跨张,PC 的历史才多久?但 MFC 与 Visual C++ 整合环境之功能强大却是不假。这本书划分为四大篇。第一篇介绍 application framework 的观念以及 Visual C++ 整合环境的各个工具元件。第二篇真正进入MFC 程式设计,不能免俗地从 "Hello World" 开始,焦点放在视窗显示身上(也就是 CView 的运用)。作者尝试以 C++ 和 MFC 完成一些功能简单的程式,像是简易绘图、图形卷动、字形输出、通用对话盒与通用控制元件、OCX 之使用等等。

第三篇才真正进入 MFC 的核心,也就是 Document-View 架构,这也是所谓 application framework 的最大特质。当你学会如何使用 Document 并且把它和 View 连接起来後,你会惊讶资料的档案动作和印表动作(包括预视功能)是多麽容易加入。这一篇的章节包括漂亮迷人的 UI 元件如工具列、状态列、分裂视窗、求助系统、属性对话盒,以及 SDI、MDI、列印、预视、动态联结函式库等主题。

第四篇的五章谈的全部都是 OLE。不像一般书籍对於 OLE 蜻蜓点水,这一篇是道道地地的硬扎货色,范围包括COM(Component Object Model)、OLE Automation、Uniform Data Transfer、Structured Storage、Embedded Servers and Containers。

第五篇谈的全部是资料库管理。一章谈 ODBC(Open Database Connectivity),另一章谈 DAO(Data Access Objects)。
网路上一位读者抱怨说,本书虽是名着,他却完全看不懂。呵啊,一切都在意料之内。作者一开始就顾着给我们完全正规的作法,用 AppWizard 产生程式码,用 ClassWizard 改写虚拟函式、拦截讯息并撰写讯息处理常式。刚开始学习Windows 程式设计的人,甚至已经有 SDK 经验但没有物件导向经验的人,根本昏头转向摸不着头绪。是的,学习MFC(或其他 Application Framework),先得有许多基础。包括 C++ 语言基础、Windows 作业系统基础、物件导向程式观念的基础。

最新消息:本书第五版已有预告,书目上写的出版日期是97 年三月。以我对 Microsoft Press 出书进度的了解,届时可能咱们还需再等一等。新书内容并非针对 Visual C++ 5.0,仍是以 MFC 4.x 为架构核心,但加了不少网路技术,如Basic TCP/IP、Winsock programming for clients and servers、MFC WinInet、DocObjects and ActiveX controls 等主题。

 

Programming Windows 95 with MFC

作者:Jeff Prosise
出版公司:Microsoft Press
出版日期:1996 第二季
页数:14 章,998 页
售价:US$ 49.95。含光碟一片。

PartI:MFC Basics
1. Hello, MFC
2. Drawing in a Window
3. The Mouse and the Keyboard
4. Menus
5. Controls
6. Dialog Boxes and Property Sheets
7. Timers and Idle Processing
PartII:The Document/View Architecture
8. Documents, Views, and Single Document Interface
9. Multiple Documents and Multiple Views
10. Printing and Print Previewing
11. Toolbars, Status Bars, and Versionable Schemas
PartIII:Advanced Topics
12. Bitmaps, Palettes, and Regions
13. The Common Controls
14. Threads and Thread Synchronization

prosise.jpg (17601 bytes)


每一位 MFC 书籍作者,最大的梦想就是其作品被誉为「C++ 中的Petzold 书籍」。有人亲访 Petzold,有人则搬出老天王来说几句话。老天王 Ray Duncan 这麽说: "Jeff Prosise has written the definitive introduction to Windows software development in the era of 32 bits and application frameworks. This book is the Petzold for MFC programming"。这段话被当作本书的广告主打词。有趣的是,尽管万方争取,Petzold 本人倒是从来没有说过什麽话。也许他想说的是『我自己来写本 MFC 经典』,呵呵。

本书有没有接班人的能耐呢?有!和 Inside Visual C++ 比较,本书在低阶部份照顾得多些,程式细节则非常完备。别误会,我的意思并非说它是那种「把五句话可以说清楚的一段文字,以十句话来表达」的书籍(),我是说它把各个技术主题挖得很深入,旁徵博引的功夫很好,资料准备得很齐全。

:另一位大师 Matt Pietrek 的书就有点这种拖拉味道,不过书仍然很棒就是了。下次我会介绍 Matt 的一本重量级作品。

本书在导入部份比 Inside Visual C++ 好。作者先安排一个极小的 SDK 程式,解释 message-based、event-driven 的程式模型,然後再安排一个极小的 MFC 程式,解释 framework 的运作,告诉你应该改写什麽函式,标准作法如何,应该拦截什麽讯息,标准作法又如何。虽然程式运行的脉络仍然不是十分清晰可寻,不过总算是表现不错了。

从章节目录可以看出,这本书选题中规中榘,该有的没遗漏,大独家倒也没有。注意,所有的范例程式都没有说明其制作过程,只是列出原始码并以文字解释原始码的意义。你知道,视觉性软体开发过程中,工具的叁与绝对少不了,而且角色日形吃重,因此,本书读者要自己想办法补足「工具的使用」这一节。Inside Visual C++ 就不一样了,几乎对於每一个程式,都详列出工具叁与的足迹。

究竟工具的使用要在什麽时候进场,才能够带来利益而不是沉重的盲与茫呢?我以为作者最好先给一个纯手工制造的MFC 程式,用来解释 MFC 程式的来龙去脉以及程式和application framework 的互动关系,然後再引进工具的使用说明,然後就安排让工具强力介入程式设计过程。毕竟,正规的、大型的 MFC 程式开发过程中少不了工具的运用。Inside Visual C++ 的作者操之过急,工具一下子全面介入,Programming Win95 with MFC 的作者又避若蛇蝎,完全舍弃工具。

过犹不及!这方面 Dissecting MFC 的作者就处理得不错。

这本书没有谈到当红的 OLE 和 ActiveX。关於这一点,Windows Developer's Journal(WDJ)的 Books in Brief 专栏(主持人是 Ron Burk)在 1996.10 有这麽一段读者与评论者的对话:

读者来函:『我还忘了说,Prosise 的这本书完全没有讨论 OLE。虽然我了解这是这本一般性、介绍性书籍的抉择,我还是认为这和书名之间存在着一种矛盾。毕竟,Win95 程式设计一定会牵扯到某些 COM 和 OLE。实际情况的确如此,现在再也不可能和 shell 交谈而没有使用 COM 物件了,Uniform Data Transfer 似乎也已经成为实作拖放(drag and drop)和剪贴(copy and paste)功能的最佳途径了。所以,忽略这个主题实在令人有点惊讶。』

Burk 回答:『我同意你的大部份观点。程式设计书籍的名称没有恰如其份地反应出书籍内容是出了名的,所以我无法不同意你的观点。然而,我绝对不赞成这本书涵盖 OLE。OLE 复杂到足够成为一本书。要在这一本已经过胖的书籍中加入一章 OLE,可想而知必然内容肤浅,就像其他为了满足市场因素而强加一章 OLE 的其他书籍一样。那样的书籍在我的架上有一大堆。与其加一章肤浅的 OLE,我宁愿作者多花时间让其他章节更有深度些。...我比任何人忍耐了更多的烂书,所以我宁愿看到涵盖主题不多但是内容十分扎实的书籍。』

「与其加一章肤浅的 OLE,我宁愿作者多花时间让其他章节更有深度些。」唔,就连我当初阅读 Carles Petzold 的世界名着Programming Windows 95 的最後一章(OLE)时,也有相同的感受。如果 Prosise 来到台湾,发现他的大作被改了名称,加上了在他抉择之外的 ActiveX,让我们猜猜他脸上的表情。这本书的中译本在原着之外增加了第零章 ActiveX,我愿意相信是出版者的用心,而不是如 Ron Burk 所说「为了满足市场因素而强加一章肤浅的 OLE」。我不愿评论中文版新加的一章内容如何,毕竟用心良苦。但是把书名也给改了,挂上斗大的 ActiveX,这种行径曾经在 BBS 上引起读者的强烈抗议,他们说这是「挂羊头卖狗肉」。

Ron Burk 说「程式设计书籍的名称没有恰当反应出其内容,是出了名的」,嗯...嗯...我也感受深刻。

 

MFC Internals

作者:George Shepherd, Scot Wingo
出版公司:Addison Wesley
出版日期:1996 第二季
页数:15 章,709 页
售价:US$ 39.95

1. A Conceptual Overview of MFC
2. Basic Windows Support
3. Message Handling in MFC
4. The MFC Utility Classes
5. All Roads lead to CObject
6. MFC Dialog and Control Classes
7. MFC's Document/View Architecture
8. Advanced Document/Vieww Internals
9. MFC's Enhanced User-Interface Classes
10. MFC DLLs and Threads
11. How MFC Implements COM
12. Uniform Data Transfer and MFC
13. OLE Documents the MFC Way
14. MFC and Automation
15. OLE Controls
Appendix A: A Field Guide to the MFC Source Code
Appendix B: The MFC Internals Floppy

george.jpg (19529 bytes)


Addison Wesley 出版公司似乎最喜欢出一些未公开秘密、内部运作奥秘之类的书籍。这是继 Windows Internetls 和 DOS Internals 和Windows 95 Internals 之後又一本黑箱书。

本书挖尽 MFC 原始码,解释 MFC 的黑箱作业原理与动作流程。这书的诉求对象已经不是想以 MFC 撰写一般程式的人,而是 MFC 玩了相当一段时间,欲有所突破的人。

应用技术欲有所突破,核心技术就得加强。很多人对於「了解 MFC 的黑箱作业」心存疑惑,总认为这违反物件导向的封装继承性以及application framework 的精神。啊,不是这麽说!你买一本汽车百科,了解汽车的构造原理,并不妨碍你「希望在没有任何机械背景的情况下,学会驾驭这一堆铁」的心愿。然而,当你看过汽车的解剖图,知道变速箱、离合器、万向传动轴、引擎燃料系统、动力传达装置、悬吊装置、煞车装置...,是否开起车来比较实实在在?了解构造原理之後,要来个甩尾大回旋,比较知道该怎麽做吧,基本操作也比较不会出错(很多人煞车时顺带把离合器踏板给踩下去,怕熄火。这习惯养成之後,高速公路上就会要你的命)。

依我之见,了解 MFC 原始码是有必要的,尤其在导入部份 -- 这是影响一个人能否学成 MFC 的关键。一本好的 MFC 书籍应该让程式员完全了解每一个奇怪巨集(像是DECLARE_MESSAGE_MAPBEGIN_MESSAGE_MAPEND_MESSAGE_MAPDECLARE_SERIALIMPLEMENT_SERIAL 等等等)的背後所代表的机制,以及每一个必须改写的虚拟函式(例如CWinApp::InitInstance、CDocument::Serial、CView::OnDraw 等等等)背後所代表的意义与动作。但是当程式的主轴精神完全掌握之後,旁支应用(例如对话盒、控制元件、列印、预视)就不需要再那麽深入探究原始码了。当然,这是指一般性质的 MFC 书籍而言,MFC Internals 本来就是要把 MFC 整个翻两翻的,所以它照挖不误。

附带一提,本书附录A对於 MFC 原始码有相当完整的一份整理。当你探索 MFC 丛林,进而发现自己和 MFC 的内脏大肠纠结不清时,附录A可以发挥指南针的功效。这里面介绍了 MFC 的常见写码风格,以及探索 MFC 所需的一些提示和工具,然後介绍 MFC 安装後的磁碟目录架构、表头档、inline 档(.INL 档)、资源档、原始档。另外,书附磁片中除了内含范例程式,还有一份 MFC FAQ(常见问答集),有 Word 和 HTML 两种格式。

 

Dissecting MFC (深入浅出 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 程式设计一览


u002p.jpg (14505 bytes)


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

这本书目前只有中文版。已经有国内出版社积极表达争取出版英文本的意愿。大陆方面,则有多家出版社亟愿将此书译为简体版,甚至直接 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 而要向你说声谢谢。』

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


侯捷 2010-09-10 08:26:32

[新一篇] 涼風起天末

[舊一篇] 到此躊躇不能去
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表