3.MFC六大关键技术之仿真(深入浅出MFC之读书笔记)

全局对象theApp的构造将早于程序进入点,调用全局函数AfxGetApp以取得theApp的对象指针(其实是获得成员变量theApp.m_pCurrentWinApp,且该成员变量继承自CWinApp类,是一个CWinApp*指针)。

MFC程序的初始化过程:
CWinApp::InitApplication;

CMyWinApp::InitInstance;

CMyFrameWnd::CMyFrameWnd;

CFrameWnd::Create;

CWnd::CreateEx;

CFrameWnd::PreCreateWindow;

CWinApp::Run;

CWinThread::Run。

类别型录网与CRuntimeClass:

在类构建起来的时候,记录必要的信息,以建立型录。型录中的类信息,最好以链表方式连接起来。这份类别型录的链表元素将以CRuntimeClass来描述,这是一个结构,其中成员包括类名、链表的Next指针以及链表的First指针(该指针属于全局变量,以static来修饰)。每个类都拥有这样一个CRuntimeClass成员变量,命名规则是在类名前加class。

DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC:

前者用于把CRuntimeClass对象放置到类之中,并声明一个可以抓到该对象地址的函数(GetRuntimeClass)。后者用于类别型录(也就是CRuntimeClass对象)的内容制定以及连接工作。

IsKindOf(类型识别):

为CObject加上一个IsKindOf函数,于是此函数将被所有类继承。它将把参数所指定的某个CRuntimeClass对象拿来与类别型录中的元素一一比较。比较成功(在型录中有发现),就传回TRUE,否则传回FALSE。

如果能够把类的大小记录在类别型录中,把建构函数(注意这里并非指C++构造函数,而是指CRuntimeClass::CreateObject)也记录在类别型录中,当程序在执行期获得一个类名称,它就可以在“类别型录网”中找出对应的元素,然后调用其建构函数产生出对象。

DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE宏就用于动态创建对象。在CRuntimeClass结构中有两个函数Load和CreateObject用于动态创建对象。

同样的对数据进行读写Serialize的主要工作就是数据的读写和对象的动态生成。使用宏DECLARE_SERIAL和IMPLEMENT_SERIAL。注意,在AppWizard生成的文档类里没有上述两个宏,这是因为文档对象不会被用来与CArchive的析取运算符相连接,也不会被包含进集合中。应用程序框架会直接调用文档的Serialize成员函数。

Command Routing(命令传递):

MFC对于消息循环的规定是:

如果是一般的Windows消息(WM_xxx),则一定是由派生类流向基类,没有旁流的可能;如果是命令消息WM_COMMAND,那就有奇特的路线了。

CWnd::WindowProc首先判断消息是否为WM_COMMAND,如果不是,就把消息往父类推去,父类再往祖父类推去。每到一个消息映射表,应该比较AFX_MSGMAP_ENTRY的每一个元素,比较成功就调用对应的处理程序。GetMessageMap是个虚函数(隐藏在DECLARE_MESSAGE_MAP宏定义中),所以它得到的消息映射表将是this所指对象的映射表。这用来完成走访消息映射表的操作。

消息一般分为Windows消息、WM_COMMAND和Notification通知消息三种。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值