《深入浅出MFC》是本人一直想深读的一本书,在刚开始学VC时虽然也曾化一些时间来看,但总觉得收获不大,经过一段时间的程序设计实践,现在回过头来看这些东西,觉得有了不少收获,或许这正是我喜欢这本书的原因所在,越读越有味道,越读越觉得书中的东西能够弥补自己的缺憾,这样的才算是真正的得到了阅读的乐趣吧。下面摘抄一些原文,并总结了一些学习心得,权当作一点小小的学习收获吧,也希望在写作和阅读的过程中获得更多的理解和体会。
文章结构如下,先引用一部分原文,然后是自己的学习心得,最后翻译了原文中引用的一段说明文件,对于要反复读取的重要书籍,我一贯采取这样的读法,先读框架结构,在细细研读,从中找出关键词句,写出自己的心得体会,然后反复用心体会,知道彻底理解为止,只有这样,才能不辜负一本优秀的技术图书作者的良苦用心和自己所耗费的时间和精力吧。
原文:
凝聚性强、组织化强的类库就是Application Framework。一组合作无间的对象,彼此藉信息的流动而沟通,并且互相调用对方的函数以求完成任务,这就是Application Framework。
对于数据结构的安排,数据的处理,数据的显示,Application Framework所能提供的,无一不是单单一个空壳而已——在C++语言来讲就是个虚函数。软件开发人员必须想办法改造(override)这些虚函数,才能符合个人所需。
很明显,Application Framework是一组超级的类库,能够被称为Framework者必须是其中的类性质紧密咬合,互相呼应。
1989年微软公司成立Application Framework技术团队,名为AFX小组,用以开发C++面向对象工具给Windows应用程序开发人员使用。AFX的“X”其实没有什么意义,只是为了凑成一个响亮好念的名字。
学习心得:
Application Framework顾名思义是“应用程序框架”,说得抽象一点是一个庞大的框架结构,该结构为程序开发提供了一个基本的实现平台,使我们能够在一群优秀工程师的工作基础上更加高效的工作。而具体一点说,实际上它是一套完整的类库,其中封装了一些实现各种功能的函数,用户只要了解这些类库的接口而不必了解其中复杂的实现过程就可以设计出实用的程序。最常见的三套C++ Application Frameworks包括Microsoft的MFC,Borland的OWL,以及IBM VisualAge的Open Class Library。所以说,如果把Application Frameworks当作一种以面向对象理论为基础的框架结构思想的话,上述三种类库则是其具体的实现。
原文:
MFC帮助我们把这些浩繁的APIS,利用面向对象的原理,逻辑地组织起来,使它们具备抽象化、封装化、继承性、多态性、模块化的性质。
为了让MFC尽可能的小、尽可能的快,AFX小组不得不舍弃高度的抽象,而引进他们自己发明的机制,尝试在面向对象领域中解决Windows消息的处理问题。即Message Mapping和Message routing机制。他们设计了一些令人拍案叫绝的宏,而这些宏背后隐藏着巨大的机制。
理解这些宏(以及他们背后所代表的机制)的意义,以及隐藏在MFC类之中的那些足以暴露原型机密的“麻烦事儿”,正是我认为掌握MFC这套Application Frameworks的重要手段。
MFC类主要可分为下列数大群组:
General Purpose classes:提供字符串类、数据处理类、异常处理类、文件类等等。
Windows API classes:用来封装Windows API,例如窗口类、对话框类、DC类等等。
Application framework classes:组成应用程序骨干者,即此组类,包括Document/View、消息泵、消息映射、消息传递、动态创建、文件读写等等。
High level abstrations:包括工具栏、状态栏、拆分窗口、滚动窗口等等。
Operation system extensions:包OLE、ODBC、DAO、MAPI、WinSock、ISAPI等等。
学习心得:
以前只知道使用,现在对MFC的概念才算有进一步了解,在程序设计过程中,应首先考虑自己实现的功能属于那一个MFC类的群组,然后再在相应的群组中选择适合自己的类进行开发,同时根据自己的需求进行扩展。
以下是对书中例子程序Scribble中readme.txt文件的翻译,个人以为虽然该文件是MFC框架中生成的最常见的文件,但从中却可以了解一些MFC所生成的各种文件的基本用途。翻译的过程也是一个很好的学习过程。
========================================================================
MICROSOFT FOUNDATION CLASS LIBRARY : Scribble
========================================================================
AppWizard为您创建了该Scribble程序。该程序不仅演示了MFC的基本使用方法,而且是您书写应用程序的起点。
该文件对实现Scribble程序所用到的程序进行了总结说明。
Scribble.h
这是应用程序的头文件。包括其他特定的头文件(包括Resource.h)并声明了CscribbleApp应用程序类。
Scribble.cpp
这是包含应用类CscribbleApp的主应用程序源文件。
Scribble.rc
该文件给出了程序使用的所有Microsoft Windows资源列表。包括存放在RES子路径下的图标,图片和光标。该文件可直接在Microsoft Developer Studio中编辑。
res\Scribble.ico
图标文件,用作应用程序图标,该图标包含在主资源文件Scribble.rc 中。
res\Scribble.rc2
该文件包含的资源无法用Microsoft Developer Studio编辑。故应把所有不可编辑的资源放入此文件。
Scribble.clw
该文件包含了ClassWizard要用到的信息,用于编辑存在的类和添加新类。ClassWizard也使用该文件存储用于创建和编辑消息映射、对话框数据映射以及创建成员函数的信息。
/////////////////////////////////////////////////////////////////////////////
对于主框架窗口:
MainFrm.h, MainFrm.cpp
这些文件包含从CMDIFrameWnd派生的框架类CmainFrame,用于控制所有的MDI框架特性。
res\Toolbar.bmp
该图片用于创建工具条要用到的图片。CMainFrame 类创建了初始工具条和状态条。编辑MainFrm.cpp 与此工具条图片相关的数组可以添加更多的工具条按钮。
/////////////////////////////////////////////////////////////////////////////
AppWizard创建一个文档类型和一个文档视图
ScribbleDoc.h, ScribbleDoc.cpp – 文档
这些文件包含CscribbleDoc类。可以通过编辑这些文件添加特殊的文档数据并实现文件的保存和装载(通过CScribbleDoc::Serialize).
ScribbleView.h, ScribbleView.cpp – 文档视图
这些文件包含CscribbleView类。CscribbleView对象用于查看CscribbleDoc对象。
res\ScribbleDoc.ico
图标文件,用作MDI子窗口图标。主资源文件Scribble.rc包含该图标。
/////////////////////////////////////////////////////////////////////////////
其他标准文件:
StdAfx.h, StdAfx.cpp
这些文件用于创建预编译头文件(PCH文件)以及一个预编译类型的文件StdAfx.obj。
Resource.h
标准头文件,创建新的资源Ids。Microsoft Developer Studio读取和更新该文件。
通过上述内容可以获得如下信息:
那个是应用程序的主文件,那些文件用于实现文档/视图结构,那些文件用于处理文档数据,那些是资源文件,分别用在什么地方,各个头文件的功能是什么,看了之后,是不是有些收获呢。