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

原创 2012年03月27日 20:48:02

全局对象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通知消息三种。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

深入浅出MFC学习笔记(第三章:MFC六大关键技术之仿真:消息映射)

消息映射机制 SDK编程中,一般处理消息的方法就是使用switch/case判断消息的类型,然后进行响应。更模块化的方法是使用第一章介绍的消息映射表的方法,把消息和消息处理函数关联起来。 应该为每...

深入浅出MFC学习笔记(第三章:MFC六大关键技术之仿真:命令传递) .

命令传递(Command routing)      消息如果是仅仅从派生类流向父类,那就非常简单了。然而MFC用来处理消息的C++类,并不是单线发展的。document/view也具有处理消息的能...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建) .

第三章:MFC六大关键技术之仿真:类型识别    深入理解MFC的内部运行原理,是本次学习《深入浅出MFC》的主要目的。要模仿的六大技术包括: 1:MFC程序的初始化过程。 2:RTTI(R...

深入浅出MFC学习笔记:(第三章MFC六大关键技术之仿真:类型识别,动态创建) .

第三章:MFC六大关键技术之仿真:类型识别    深入理解MFC的内部运行原理,是本次学习《深入浅出MFC》的主要目的。要模仿的六大技术包括: 1:MFC程序的初始化过程。 2:RTTI...

深入浅出MFC学习笔记(第三章:MFC六大关键技术之仿真:命令传递) .

命令传递(Command routing)      消息如果是仅仅从派生类流向父类,那就非常简单了。然而MFC用来处理消息的C++类,并不是单线发展的。document/view也具有处理消息...

MFC六大关键技术之仿真学习笔记(二)

上一节简单学习了关于MFC中简单的层次结构,而MFC程序的初始化过程究竟是怎么样的呢,与普通Win32初始化的联系又在哪呢?         Win32程序通过RegisterClass,Create...

MFC六大关键技术之仿真学习笔记(一)

相信大多数MFC初学者都有一种这种感觉,MFC的框架如此复杂,宏定义虚函数让你不知所措,和传统的Win32SDK编程相比,MFC确实让你足够头疼,粗略看看你发现找到Winmain和WndProc都不是...

MFC六大关键技术之仿真学习笔记(八)

前一节写到,在类关系中我们已经建立了一种消息映射的机制,消息具体是如何在类中传递的,是一个值得我们去研究的问题,待我一一道来。 *Command Routing(命令传递) 实现消息的纵向流动,我们...

追根究底,MFC六大关键技术剖析(3)

追根究底,MFC六大关键技术剖析(第三部分)动态创建 动态创建就是运行时创建指定类的对象,在MFC中大量使用。如框架窗口对象、视对象,还有文档对象都需要由文档模板类对象来动态的创建。我觉得这是每...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)