图书前言

不经意间,距本书第1版出版已经有近十年光景了,而微软的Visual C++ 6.0,特别是其核心项目MFC,自其1992年初发布的MFC 1.0(即MS C/C++ 7.0) 开始也已经在业界驰骋拼杀20个年头了。本书的不断改版,固然是读者的抬爱,对于MFC来说,则不能不说是一个奇迹,因为迄今为止,在软件业发展史上除了MFC还没有一款软件受到如此瞩目。对之大加赞扬,乃至成为其忠实粉丝的拥趸者有之,而对其投以藐视、甚至鄙视的目光,称其代码丑陋无比而大加挞伐的也为数众多,但这种毁誉参半的评价却未妨碍它的广泛应用。这究竟是Visual C++ 6.0代码并不像藐视者所说的那么丑陋,还是因其代码效率高而没有太在意它的丑陋而使人们勉为其难地在使用它?不得而知。尽管在有了Java和.NET的今天,以MFC为主的Visual C++ 6.0仍然在桌面系统程序开发上以其独有的高效率优势而占有一定市场份额。

随着IT业的发展,新程序开发工具的不断涌现,不知从何时起,关于MFC又多个了一个话题: "MFC是否已经过时?”有人说它从出生那天起就过时了,也有人说它始终没过时,甚至时不时地有人在预测它什么时候过时以及将由什么工具来代替。一直到微软公司自己推出了自认为可代替MFC的.NET之后,人们认为MFC这回真的是要寿终正寝了,谁知到了.NET已经推出了Visual Studio 2010的当下,MFC仍然像幽灵一样徘徊于业界各个角落。

作为本书的作者,经常收到一些读者来信询问诸如上述的MFC会不会过时,学习MFC是不是还有意义之类的问题。对于头一个问题,我的回答是,不知道,真不知道。对于第二个问题我的回答是,有意义,非常有意义,因为在应用程序框架领域,MFC是一款具有历史意义的软件,它之所以能够在质疑和争论中被应用到今天,那就是因为它有巨大成功之处,也有因软件工程发展阶段限制的失误及失败之处,这一切都是软件业的财富。对这种财富视而不见,不学习,不继承,岂不是傻瓜?  众所周知,自面向对象程序设计思想出现之后,C++是第一个借助C的优势而真正在业界广泛推广了起来的面向对象编程语言,而MFC则是第一个使用C++编写的Windows应用程序框架,正是因为有了它(当然还有VB) ,那些深陷于Windows数千个API函数中的程序员才被解放了出来,也才有了以后Windows应用程序的蓬勃发展。

正因为这两个第一次,即两个首次,所以C++语言的稚嫩和不完善(例如不合逻辑的多继承,以及还没有接口的概念等),以及MFC设计者们对面向对象程序设计思想理解得不深刻,使得MFC的有些代码看起来确实丑陋,例如它那难于理解的六组宏,层次过多的类继承关系,等等。但就当时的条件,事实求是地说,微软已经做得足够好了,更何况在它发展ATL时很快就做了方向正确的改进,这也可能是Visual C++ 6.0能坚持到今天的原因之一吧。

总之,放着眼前这个透漏了微软前期技术、发展轨迹以及其成功和失误(这些东西都在后来极大地影响了Java和.NET的C#)的现成实例不借鉴、不学习,是不明智的。所以作者始终认为,即使将来MFC最终退出了历史,作为专攻计算机技术的人,特别是有志于计算机软件技术的学生,任何时候都要学习MFC,必要时还要对其成功和失败之处进行研究探讨。

为了在一定程度上把MFC与.NET联系起来,第3版改写了第1章并添加了第18章。第1章中,在介绍Windows应用程序结构的同时,把微软在操作系统(平台)的发展中所涉及的DOS、Windows和.NET之间的关系做了尽可能简单的介绍。在新添加的第18章中,为了说明MFC在.NET中的地位,也为了读者以后学习.NET的方便,在较为详细地介绍了.NET这个平台的相关技术之后介绍了非托管的MFC和托管的C++/CLI,企图使读者对Visual C++在Windows中的应用有一个相对清晰的了解和认识,从而不至于让微软的那些让人眼花缭乱的术语弄得晕头转向。

因本书是为普通高等学校计算机或计算机软件工程专业学生编写的教学用书,所以对于那些需要着重学习编程技巧的读者并不适合,请慎重购买。

本书在编写过程中参阅了大量参考文献和网上资料,在此谨对这些文献、资料的作者及提供者表示衷心的感谢。同时也对本书的前两版提出意见、建议以及来信对作者给予鼓励和支持的读者表示诚挚的感谢。当然,还要感谢清华大学出版社。

参加本书编写的有房红征、陈涛、李益民、车进辉和任哲,由任哲负责统稿。

希望读者喜欢本书。如对本书有意见和建议,请与作者联系。

最后,希望本书能给各位带来好心情!

作者2013年2月 

前言 第2版

前言  由于广大读者的抬爱及清华大学出版社的鼓励,本书有幸再版。在此首先对广大读者和出版社表示衷心的感谢。自本书第1版出版以来,作者陆续收到一些读者来信,针对这些来信,作者准备谈以下两个问题。

1. 为什么要学习MFC

作者在第1版前言中就说过,通过对MFC的学习,除了可以使学生掌握一种Windows应用程序设计的基本方法之外,还可以使他们进一步全面、深刻地理解面向对象程序设计的思想,从而把握程序设计方法的发展方向。对此,曾经有读者提出过疑问:Visual Basic、Delphi、C#.NET、Java不都是面向对象的吗?为什么非要学习目前看起来似乎有些落后的MFC呢?

诚然,从时间上来看,MFC是微软较早开发的Windows应用程序框架,历史比较悠久。但是,请读者注意,历史悠久与落后绝不是同一概念。当然也不意味着只要学会了MFC就可以打遍天下,解决所有问题,但就MFC所蕴涵及所展露的程序设计思想、代码实现技巧,则是其他开发工具所不及的。

作为世界上第一个应用程序框架类库的MFC,是在C++尚未完善,尚不支持某些功能的时候产生的,MFC设计者们就是使用这种当时还比较低级的C++实现了这个庞大程序框架的各种复杂功能,因此MFC的各个角落都充满了这些设计者的智慧和技巧,这些智慧和技巧都体现了当今软件工程技术的重要思想和发展方向,以至于对C++的发展和随后出现的Java、C#技术等,都产生了极为深刻的影响,甚至有些就是MFC技术的直接应用。作者认为,迄今为止还没有一个应用程序框架类库能具有如此之大的信息量,所以它是计算机专业教育和教学的绝好素材。

作者认为, 通过对MFC的学习至少可以达到如下几个目的: 一是可以学习Windows应用程序的特点(图形界面、多任务、事件驱动)、数据和函数的组织方法(资源、动态链接库)和结构(接收、分派消息的主程序模块和处理消息的消息相应程序模块)及其处理思想;二是通过MFC这个大实例,可以学习面向对象程序设计的实际方法(例如文档/视图结构的构思);三是可以学习MFC设计者们的一些巧妙的程序设计方法和技巧(例如消息映射、对象动态创建、序列化);四是可以学习Visual C++这个开发环境的使用,真可谓是一举多得。所以,作为每一个立志从事计算机工作的人来讲,不在一定程度上了解和掌握MFC将会是他的终生遗憾。

 MFC Windows应用程序设计(第3版)第2版前言 当然,其他开发工具也有它们各自的特点和优势,也值得学习。例如,Visual Basic作为微软开发的第一套可视化开发环境,是它把DOS程序员从汪洋大海般的Windows API函数中解救出来,为Windows应用程序的设计和发展做出了不可磨灭的贡献。但是,它使用的并不是非学不可的Basic这种非主流语言,所以对于学时极为有限和宝贵的学生来说,是否非得在校学习它就值得考虑。而使用PASCAL语言的Delphi和使用C/C++语言的C++Builder以其提供的丰富组件,在快速开发应用程序方面确实具有一定的优势,但它们与Visual Basic一样,把Windows底层封装得太严了,程序员只剩下填空的份儿,以至于使它们成了一种“傻瓜”式的开发工具,这当然不适合以教授和学习程序设计思想和设计方法为目的的学校来使用。

当然,作者也认可业界 “聪明人用Delphi,高手用VC”之类的说法,因为在实际工程中,为了满足工程期限的需要,而采用Delphi之类的快速开发工具是合理并应该的。但并不意味着学生在学校学习期间一定要拿出大量的课时去学习这些快速开发工具(工具无所谓会不会的问题,而是熟不熟的问题),因为高等学校毕竟是教育机构而不是培训机构,不但要让学生知其然也更应该让其知其所以然,从而在此基础上形成较强的软件开发(甚至是研发)能力,而不是只让学生会几门流行的技术而使学生一辈子在技术发展背后疲于奔命。

那么学习Windows SDK编程又如何呢?作者认为,用函数编程这是C程序设计课程解决的问题,学生学习了C语言之后只要肯下工夫,多实践,自学Windows SDK程序设计是完全可以的,没有必要再浪费宝贵的课时了。

也正因为上述种种原因,所以本书既不以剖析MFC源代码为主,也不以介绍Visual C++开发工具的使用为主,而是以重点介绍MFC框架的设计思想、理念和方法为基础,兼顾应用,从而使读者通过对MFC的学习,除了掌握MFC之外,还能进一步深化理解C/C++、数据结构、操作系统乃至计算机硬件的相关知识,尽快提高程序设计能力并为学习其他应用程序设计工具打下良好的基础。

2. 第2版的变化

自本书的第1版出版以来,笔者陆续接到许多读者的来信,其中既有教师也有学生和程序设计人员,在信中都在对本书褒奖之余对书的内容及编写提出了很好的意见与建议,并希望作者在有机会的条件下进行修改。在此,作者首先对这些关心本书的读者表示由衷的谢意。

综合了读者的意见之后,《MFC Windows应用程序设计(第2版)》特做如下变化:

因为本书旨在说明MFC的思想,所以只要能以模拟方式说明其思想的,本书就采用了模拟方法。显然本书第1版在消息映射的模拟和叙述上过于潦草,给一部分读者学习这部分时造成了一些不必要的困难。故此,作者在第2版中进行了必要的修改,使得这部分的介绍更为合理、清楚。

文档/视图结构是MFC应用程序框架的核心。为此,作者在第2版的第3章中适当增加了文档/视图结构程序框架各对象的创建顺序、对象之间的联系、消息的传递等内容,以期使读者对文档/视图结构及其各对象之间的关系有更清楚的认识和了解,为读者精研MFC打下一个更加良好的基础。另外,在这一章中还加强了对象动态创建的介绍。

参考读者建议,作者把第9章的内容在顺序上做了改变: 先介绍相对比较容易的CFile类,后介绍CArchive类,最后介绍文档序列化,并且加强了序列化部分的说理性。

异常及异常处理是一个健壮的应用程序必备特性,这方面的内容的缺失不能不说是第1版的一个缺憾,这次在第2版中把它补齐了。

当然,为追求内容的完整性,本书至少还应该补上MFC在网络上的应用(这也是读者的建议),但作者思虑再三后认为,作为教材本书还是不包含这部分内容为好,一是因为MFC在网络程序方面并不占优势,二是因为各个学校都是在C#.NET或Java等课程中处理该问题,如果本书包括这部分内容的话,在教学上会造成内容的重叠。

另外,正如一些读者所指出的,第14章“组件对象模型COM基础”出现在本书中显得比较生硬: 第一,组件对象模型的内容对于本科生来讲似乎是难了一些;第二,这本书讲的是MFC,而这一章讲的是ATL,确实与本书不配套。关于第一点,作者认为不是问题,学生觉得难,一是因为没有好的教材,二是学生原来接触这方面的技术比较少,但不管是什么原因,在组件应用如此广泛的今天,计算机专业特别是以软件设计为培养目标的专业不向学生讲授这方面的知识是无论如何不行的,但是,现在大多数本科学校又没有相应的课程来介绍这方面的内容,再者组件技术把抽象类的应用发挥到了淋漓尽致的程度,不学它是不会深切领会抽象类的精神实质以及它的应用的,所以本书就勉为其难地编写了这部分的入门知识。为了降低学习这部分内容的台阶,作者重写了这一章。至于第二点,生硬就生硬了吧,因为ATL在组件设计方面确实要比MFC强许多。

正如前面所讲,MFC信息量巨大,涉及程序设计的方方面面,因此需要读者在阅读本书时不但要不断地复习C/C++的内容,还要不时地阅读其他书籍,尤其是数据结构、操作系统等。

另外,还要多找一些实例上机做实验(提供这样例题的书籍及网上资料很多). 

本书在编写过程中参考了大量的相关文献和网上的资料,并引用了其中的一些例题、文字和插图,在此对这些文献和资料的作者表示诚挚的谢意。同时也对关心本书的读者表示万分的感谢。

参加本书编写工作的有任哲、房红征、李益民、车进辉。另外,刘泰辉博士对于本书的章节及内容的安排提出的良好意见和建议,也使本书增色不少。

将信息量如此巨大的MFC在一本50万字的教学用书中进行介绍,对水平有限的作者来说实在是一件难事,所以在此恳请读者对书中的缺点和错误提出批评和指正。同时,也希望阅读本书的读者或使用本书作为教材的教师能与作者共同探讨,以期对本书作进一步的改进。欢迎读者及时与作者沟通。

通信地址: 北华大学计算机科学技术学院

邮编: 132021

祝各位教学有成!

作者2007年 7月

第1版前言  这些年来,Windows一直是一个主流操作系统,市场上对开发Windows应用程序的需求与日俱增。随着Windows操作系统的发展,Windows应用程序变得越来越复杂,使得单纯使用Windows API来开发Windows应用程序变得越来越困难。于是,一些可视化的Windows开发工具(如Visual Basic、Delphi、C++Builder等)如雨后春笋般地涌现出来,这无疑给Windows应用的开发带来了极大的方便,同时也大大地提高了开发效率。但是,由于这些开发工具对应用程序框架的代码封装得过于严密,因而使得对Windows低层应用的开发几乎成为不可能。而Microsoft基础类库(Microsoft fundation classes, MFC)只是使用C++类对Windows API进行了封装,它一方面较好地屏蔽了Windows编程的复杂性,使得Windows应用程序的设计变得简单起来,另一方面仍然允许有经验的程序员使用Windows的底层功能开发高效的Windows应用程序,再加上与MFC配套的开发工具Visual C++提供的功能强大的各种Wizard(向导),使得MFC成为了一个强有力的Windows应用程序的开发工具。

目前,各高等学校已经把C/C++列为理工科专业学生的必修课程,这门课程使学生初步了解和掌握了面向对象程序设计的思想和方法,这无疑为学生学习和掌握MFC打下了良好的基础,同时对MFC的学习,除了可以使学生掌握Windows应用程序设计的基本方法之外,又可以使学生更进一步深刻、全面地理解面向对象程序设计的思想,从而把握程序设计方法的发展方向。

基于上述这些理由,各个高校都在MFC的教学方面进行了积极探索。本书是作者积数年教学经验,为高等学校理工科学生编写的一部应用MFC进行Windows应用程序设计的入门教材。

全书共有16章,参考教学时数50学时。

本书的特点是遵循循序渐进的教学原则,以较大的篇幅从Windows SDK程序入手,在介绍Windows应用程序一般特点的基础上,重点介绍Windows的消息机制和Windows程序的基本结构,以C++类对其进行模拟封装使学生迅速建立起MFC应用程序框架的基本概念;然后以精练的语言介绍Windows的图形图像处理、应用程序界面、资源、动态链接库、进程与线程管理等知识。最后,为使学生对软件工程的发展有一个初步的了解又介绍了组件对象模型(COM) 、ActiveX技术和数据库的基本常识。

为配合教学和学习,本书为每一个知识点都配以必要的实例,力求通过实例让读者掌握MFC程序设计的特点及方法,所有实例都在Windows 98和Visual C++6.0环境中测试通过。并且,为配合教师教学,本书为使用本教材的教师免费提供源代码和电子教案。

本书在编写过程中得到了吉林大学张长海教授及其他教师的悉心指导,在本书的内容、章节编排等方面提出了宝贵意见和建议,在此对他们的帮助表示衷心的感谢。本书在编写中还参考了大量的相关文献,并引用了其中的一些例题和内容,在此也对这些文献的作者表示诚挚的谢意。

参加本书编写工作的有任哲、李益民、车进辉。由于作者水平有限,恳请读者对书中的缺点和错误提出批评和指正,欢迎读者与作者联系。

通信地址: 北华大学计算机科学技术学院

邮  编: 132021

作 者2004年4月