

前言
前言前言
前言
现在流行的 Windows 下的编程语言实在不少,所以在 BBS 上常常有人会问:我应该使
用什么编程语言呢?其中,有一个大家认可的答案:真正的程序员使用 Visual C++。
的确,Visual C++是一个功能强大、灵活、方便的编程工具,可以完成其他编程语言所
无法完成的任务,可以让程序员方便地实现自己的设计,尽情的发挥自己地创造性。
Visual C++的强大无比的功能除了得益于 C++的特性之外,更重要的是它具有体系完
整、机制灵活、功能丰富的 MFC 类库。
所以,要讲 Visual C++,必须讲 MFC 类库。
MFC 的类库可以分两个层次,首先是实现 MFC 编程框架体系的核心 MFC 类库,然后
是建立在核心 MFC 类库基础之上的扩展类库,例如,支持 COM 的类库,实现网络功能的
类库,等等。随着 Visual C++的不断升级,MFC 类库的功能越来越丰富,越来越强大,但
是,MFC 核心类库是相对稳定的,特别是从 Visual C++ 4.2 开始到现在的 Visual C++6.0。
本书的中心就是深入浅出地解析 MFC 类库,分析怎么使用 MFC 类库以及 MFC 类库的
内部实现,揭开 MFC 复杂、深奥的面纱,让读者对 MFC 有一个全面、透彻、清晰的理解。
关于 MFC 的核心实现,主要有以下几个方面。
首先,MFC 采用 C++的面向对象的特征封装了 Windows 的对象和 Win32 函数,一定程
度上隐蔽了底层 Win32 的复杂性。
其次,MFC 采用消息映射的方法来处理 Windows 消息和事件,隐藏了 Windows 窗口的
窗口过程,简化了消息处理的复杂性和烦琐性。
还有,MFC 提供了一个以文档-视为中心的编程模式,并实现了以文档-视为中心的编程
框架,简化了数据处理的过程。
而且,MFC 提出了模块状态、线程状态、模块线程状态来支持多线程的编程设计和 DLL
的编程。
本书分别从使用 MFC 的角度和 MFC 内部设计及实现的角度讨论了上述内容,分析了
MFC 核心的设计和实现;然后,在此基础上,进一步讨论了 MFC 对一些常用类的实现。有
关章节的内容如下:
第一章,MFC 概述。
第二章,解释 MFC 对 Win32 API 和 Windows 对象的封装,讨论各类 MFC 对象的使用,
分析 MFC 对象和 Windows 对象的关系。
第三章,讨论 CObject 的特性及其实现,包括动态类信息、动态创建、序列化的实现等
内容。
第四章,讨论 MFC 的消息映射机制,分析 MFC 对各类消息的处理,例如对 Windows
消息、控制通知消息、命令消息、状态更新消息、反射消息的处理等;并揭示了 MFC 通过
消息映射手段实现 C++虚拟函数机制的原理。
第五章和第六章,分析 MFC 编程框架启动和关闭一个应用程序的过程,揭示 MFC 框
架的内幕,剖析以文档模板为核心创建基于文档-视的应用程序的过程,展示 MFC 框架处理
消息和调用虚拟函数的时机和位置。
第七、八、九章,介绍 MFC 的动态链接库、进程、线程等概念,以及 MFC 动态链接
库的种类和使用,讨论 MFC 下多线程编程的问题。并且进一步阐述 MFC 的核心概念之一:
状态(模块状态、线程状态、模块线程状态),揭示 MFC 对多线程的支持机制,MFC 实现
规则 DLL 和扩展 DLL 的内幕。
第十章,阐述 MFC 下的调试手段。

第十一章,讨论 CFile 类,主要分析了 CFile 的使用和它对 Win32 文件函数的封装。
第十二章,讨论模式和无模式对话框,分析 MFC 如何设计和实现这两种对话框的功能,
分析 CDialog 和 CFormView 为实现有关功能而设计的虚拟函数、消息处理函数等。
第十三章,讨论 MFC 工具栏和状态栏的设计及其实现,分析 MFC 是如何以 CControlBar
为基础,派生出 CStatusBar、CToolBar、CDialogBar 等子类,实现 MFC 工具栏和状态栏标
准处理。
第十四章,讨论 MFC 的 Socket 类。
第一章到第十章介绍了 MFC 的核心概念以及实现。在此基础上,第十一章到第十四章
讨论了 MFC 一些常用类的实现。
本书的内容对 MFC 的初学者(最好对 Visual C++和 Windows 有所了解)和提高者都是
很有帮助的。
如果您是一个初学者,可以读第一至第六章。主要目的是建立对 MFC 的全面理解,了
解 MFC 框架是如何支持程序员编程的。如果有读不懂的地方,可以跳过,直接阅读有关分
析的结论。特别是第五章和第六章,可以重点阅读,了解 MFC 是怎样来处理有关消息、调
用有关虚拟函数的。
然后,还可以读第十章,第十一至第十四章。特别第十二章,可以重点阅读,它是 MFC
从 CWnd 或者 CView 派生出特定的类实现特定功能的例子,可以帮助您进一步理解 MFC,
并且学习如何设计和实现一个特定的类。
如果您对 MFC 有一定的掌握,可以进一步阅读第八和第九章,了解 MFC 处理 DLL 和
线程的知识。对于第一至第六章、第十至第十四章,应该把重点放在 MFC 的设计和实现的
分析上。这样,可以深化您对 MFC 和 Windows 编程的理解与掌握。
如果您可以较熟练地使用 MFC,建议您进一步阅读第九章,并且对所有有关章节的设
计和实现分析作重点阅读,这样,不仅可以帮助您深入的理解和掌握 MFC,而且,从 MFC
的有关内部设计和实现上,必然可以提高您的程序设计和编写能力。
由于成书仓促,书中可能存在一些缺点和错误,恳请您不吝赐教!作者的电子邮箱:
ljjin@public.szonline.net。
作者 李久进
1999 年 6 月

约定和说明
约定和说明约定和说明
约定和说明
1.图解或者说明的流程都是 MFC 的缺省实现。
2.对于 Win32 全局函数,用“::”为前缀,以区分 MFC 的成员函数;如果从上下文可
以明确判定一个函数是全局函数,则省掉“::”前缀。
3.本书图解时,使用灰色框表示注释。如果注释某个函数是某个类的成员函数,则表
示该类是定义该函数的最上层的类。
4.流程图所描述的函数的流程不一定是该函数的程序流程,可能是该函数运行时的执
行流程。比如:函数 A 图解为函数 B→函数 C,可以是函数 A 先调用函数 B,然后调用函
数 C;或者函数 A 调用函数 B,函数 B 调用函数 C。
5.流程图省略了对 OLE 的处理。
6.流程图中表示调用了某个成员函数,使用了类限制符号。如果用正体表示类名和函
数名(形式为 ClassName::FunctionName),则程序源码中没有类名约束,分几种情况:如
果是虚拟函数则表示该函数动态约束的结果是调用了指定类的函数;如果是消息处理函数,
表示指定类的消息处理函数被调用;如果不是上述两种情况,表示该函数调用了指定类的实
现。如果用斜体表示表示类名和函数名(形式为 ClassName::FunctionName),则程序的源
码明确使用了类的限制符号来调用函数。
7.动态连接到 MFC DLL 定义了_AFXDLL 符号。引用的 MFC 源码如果定义了该符号,
则表示在动态连接情况下使用。
8.“MFC DLL”指 MFC 的核心 DLL,即 MFCXX.DLL。
9.某个类的对象表示该类的一个实例。例如,CWinApp 对象表示 CWinApp 类的一个
实例。“类的实例”和“类的对象”两种说法可以互换。
10.MFC 对象是 C++对象,即一个 C++类的实例;Windows 对象是 Windows 操作系统
定义的数据结构的实例。一个 Window 对象对应一个 MFC 对象。
11.“类的成员数据”和“类的成员变量” 两种说法可以互换,都表示类的属性。
12.文档和文件,使用“文件”的地方可以用“文档”代替,表示一个操作系统的文件;
使用“文档”的地方一般还有“文档”对象的含义。
13.MFC 窗口类表示 CWnd 或其派生类;Windows“窗口类”表示程序注册的 Windows
Window 对象的类,书中表示 Windows“窗口类”的地方用引号加以区分。

前言
前言前言
前言 ............................................................................................................1
约定和说明
约定和说明约定和说明
约定和说明 ................................................................................................4
第
第第
第 1
11
1 章
章章
章 MFC
MFC MFC
MFC 概述
概述概述
概述 .......................................................................................9
1.1 MFC
1.1 MFC1.1 MFC
1.1 MFC 是一个编程框架
是一个编程框架是一个编程框架
是一个编程框架 .......................................................................................................9
1.1.1 封装
封装封装
封装.........................................................................................................................9
1.1.2 继承
继承继承
继承.........................................................................................................................9
1.1.3 虚拟函数和动态约束
虚拟函数和动态约束虚拟函数和动态约束
虚拟函数和动态约束...........................................................................................10
1.1.4 MFC 的宏观框架体系
的宏观框架体系的宏观框架体系
的宏观框架体系..........................................................................................10
1.2 MDI 应用程序的构成......................................................................................................11
1.2.1 构成应用程序的对象............................................................................................11
1.2.2 构成应用程序的对象之间的关系.......................................................................12
1.2.3 构成应用程序的文件............................................................................................13
第
第第
第 2
22
2 章
章章
章 MFC
MFC MFC
MFC 和
和和
和 Win32
Win32Win32
Win32 ..............................................................................15
2.1 MFC Object
2.1 MFC Object2.1 MFC Object
2.1 MFC Object 和
和和
和 Windows Object
Windows ObjectWindows Object
Windows Object 的关系
的关系的关系
的关系 .....................................................................15
2.2 Windows Object................................................................................................................17
2.2.1 Windows 的注册....................................................................................................17
2.2.2 MFC 窗口类 CWnd...............................................................................................19
2.2.3 在 MFC 下创建一个窗口对象 ............................................................................22
2.2.4 MFC 窗口的使用 ..................................................................................................23
2.2.5 在 MFC 下窗口的销毁 ........................................................................................23
2.3 设备描述表......................................................................................................................24
2.3.1 设备描述表概述...................................................................................................24
2.3.2 设备描述表在 MFC 中的实现 ............................................................................26
2.3.3 MFC 设备描述表类的使用 ..................................................................................27
2.4 GDI 对象 ..........................................................................................................................29
第
第第
第 3
33
3 章
章章
章 CObject
CObject CObject
CObject 类
类类
类 .................................................................................31
3.1 CObject
3.1 CObject3.1 CObject
3.1 CObject 的结构
的结构的结构
的结构 .............................................................................................................31
3.2 CObject 类的特性 ............................................................................................................32
3.3 实现 CObject 特性的机制 ..............................................................................................34
3.3.1 DECLARE_DYNAMIC 等宏的定义 ...................................................................34
3.3.2 CruntimeClass 类的结构与功能...........................................................................36
3.3.3 动态类信息、动态创建的原理...........................................................................39
3.3.4 序列化的机制.......................................................................................................40
第
第第
第 4
44
4 章
章章
章
消息映射的实现
消息映射的实现消息映射的实现
消息映射的实现 ........................................................................42
4.1 Windows
4.1 Windows4.1 Windows
4.1 Windows 消息概述
消息概述消息概述
消息概述 .........................................................................................................42
4.1.1 消息的分类
消息的分类消息的分类
消息的分类...........................................................................................................42
4.1.2 消息结构和消息处理
消息结构和消息处理消息结构和消息处理
消息结构和消息处理...........................................................................................42
4.2
4.2 4.2
4.2 消息映射的定义和实现
消息映射的定义和实现消息映射的定义和实现
消息映射的定义和实现.................................................................................................44
4.2.1 MFC 处理的三类消息
处理的三类消息处理的三类消息
处理的三类消息..........................................................................................44
4.2.2 MFC 消息映射的实现方法
消息映射的实现方法消息映射的实现方法
消息映射的实现方法..................................................................................44
4.2.3 在声明与实现的内部
在声明与实现的内部在声明与实现的内部
在声明与实现的内部...........................................................................................45
4.2.4 消息映射宏的种类
消息映射宏的种类消息映射宏的种类
消息映射宏的种类...............................................................................................49
4.3 CCmdTarget
4.3 CCmdTarget4.3 CCmdTarget
4.3 CCmdTarget 类
类类
类 ...............................................................................................................51
4.4 MFC
4.4 MFC4.4 MFC
4.4 MFC 窗口过程
窗口过程窗口过程
窗口过程 .................................................................................................................53