《MFC读书笔记》
今天终于将《深入浅出MFC》(侯俊杰)这本书大体看了一遍(其实一直想看的,只是速度实在太慢),对这本有了一个了解。我认为这是本好书,虽然现在vc的开发环境已经出到visual studio 2010版本了,比该书使用的编译环境vc4.0版本有了太多的改变,但是这本书仍是我们了解MFC原理和机制的好书,虽然它已经有十多年的历史了。
一、win32编程方面的知识
介绍windows程序编程的基本的原理。WinMain函数是windows程序的入口函数,是程序的入口点。
1、窗口的注册和诞生:
1)、RegisterClass注册窗口类,设定窗口类的属性(被封装在InitApplication中)。使用了大型数据结构WNDCLASS 作为函数的参数。
2)、CreateWindow产生窗口(封装在InitialInstance中) 。
3)、进入消息循环:
TanslateMessage(&msg)
DispatchMessage(&msg)
Message Map(消息映射)是消息的路径的查找地
4)、ShowWindow显示窗口
5)、UpdateWindow更行窗口(WM_PAINT)
2、空闲时间处理OnIdle
系统中没有任何等待处理的消息的时间。
3.console程序
是Win32程序,和Dos程序想区别。
4、进程和线程(process and thread)
进程控制程序的优先级,而线程才是cpu调度的基本单位。这一部分和本书后面MFC多线程程序设计练习在一起。
二、c++重要性质
1、类及其成员 重要性质:封装(encapsulation)
2、基类和派生类 重要性质:继承(Inheritance)
3、虚函数和多态(polymorphism)
4、构造函数和析构函数
5、运行时类型识别(RTTI)
6、动态创建(Dynamic Creation)
7、Template
由于c++方面的知识很基础,就不在累述。其中virtual function、RTTI、Dynamic Creation、Template后面经常用到,是非常重要的性质,也比较难掌握。
三、MFC程序的仿真
MFC数个重要的类层次关系图:
1、MFC程序的初始化过程:
pApp->InitApplication();
pApp->InitInstance();
pApp->Run();
2、RTTI(运行时类型识别)
类别型录网:CRuntimeClass
DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏
DECLARE_DYNAMIC宏定义为:
#define DECLARE_DYNAMIC(class_name)\
public:
static CRuntimeClass class##class_name;\
virtual CRuntimeClass* GetRuntimeClass() const;
IMPLEMENT_DYNAMIC宏:
#define IMPLEMENT_DYNAMIC(class_name,base_class_name) \
_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)
3、IsKindOf(类型识别)
函数利用GetRuntimeClass取得&CView::classCView,然后在循线而上。
4、Dynamic Createion(动态创建)
DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE宏
#define DECLARE_DYNCREATE(class_name)\
DECLARE_DYNAMIC(class_name)\
static CObject* PASCAL CreateObject();
#define IMPLEMENT_DYNCREATE(class_name,base_class_name)\
CObject* PASCAL class_name::CreateObject()\
_IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,\
class_name:CreateObject)
构造的类别型录网:
5、serialize(数据读写)
每个可写到文件或可从文件读出的类,都有自己的serailize函数,负责他自己的数据读写文件操作。
应该改写<<和>>运算符,将数据流到archive中。
使用了DECLARE_SERIAL/IMPLEMENT_SERIAL宏实现(这里,我们可以看到,一般的宏都是使用DECLARE_XX来定义宏,使用IMPLEMENT_XX来实现宏)。
archive是一个与文件息息相关的缓冲区 。
6、Messae Maping(消息映射)
使用了宏来定义了一个巨大的建构,可以人为是一个巨大的数据结构体。
定义AFX_MSGMAP、AFX_MSGMAP_ENTRY数据结构和AFX_PMSG函数指针
定义了DELARE_MESSAGE_MAP宏 声明了一个数据结构
这个数据结构的填充由三个宏完成:BEGIN_MESSAGE_MAP、ON_COMMAND、 END_MESSAGE_MAP。
7、Command Routing(命令传递)
全局函数AfxWndProc是命令传递的推动引擎的起始点。
四、Visual C++集成开发环境
介绍vc IDE方面的一些知识,略过。
五、总观Application Framework
介绍Application Framework的相关知识和MFC方面的一些知识:MFC的一些类、Afx全局函数、MFC宏(macros)、MFC数据类型等。
六、MFC程序的生死因果
介绍MFC的内部结构和程序的内部实现
参考第一章(C/SDK),查看MFC程序的来龙去脉。
1)、CWinApp-取代WinMain地位
2)、 CFrameWnd-取代WndProc的地位
3)、Application object
4)、AfxWinInit-AFX内部初始化操作
5)、CWinApp::InitApplication
6)、CMyWinApp::InitInstance
7)、CFrameWnd::Create产生窗口
CWinApp::Run
Message Map将消息和处理函数连接在一起
本书详细的介绍了MFC程序的诞生、运行和死亡。
七、MFC骨干程序
Document/View构架
Document Template
八、Document-View深入探讨
CDocTemplate 管理 CDocument/CView/CFrameWnd
Serialize
九、消息映射和命令传递
这里是对前面内容的深化和拓展,不在雷总。
十、MFC于对话框
主要介绍使用classWizard来创建对话框,流过。
十一 、View功能的加强和重绘
介绍关于View方面的一些操作,很常用。
1、UpdateAllViews和OnUpdate
2、View中hint的使用
3、窗口滚动:CScrollView
4、拆分窗口:Splitter
动态拆分:CSplitterWnd类的Create函数
十二、打印与预览
介绍程序的打印和预览功能的设计。
十三、多重文件和多重视图
MDI、SDI
动态拆分窗口
静态拆分窗口:CSplitterWnd类的CreateStatic函数
十四、MFC多线程程序设计
介绍进程和线程的含义和这方面和一些知识。
十五、定制一个AppWizard
AppWizard的使用。
十六、ActiveX Controls的使用
有待深入。