欢迎来到论文网! 识人者智,自知者明,通过生日认识自己! 生日公历:
网站地图 | Tags标签 | RSS
论文网 论文网8200余万篇毕业论文、各种论文格式和论文范文以及9千多种期刊杂志的论文征稿及论文投稿信息,是论文写作、论文投稿和论文发表的论文参考网站,也是科研人员论文检测和发表论文的理想平台。lunwenf@yeah.net。
您当前的位置:首页 > 科技论文 > 计算机论文

MFC消息映像与消息路由网络构建及仿真(图文)

时间:2011-04-24  作者:秩名

论文导读:本文提出了MFC消息映像与消息路由网络构建与仿真的实施方案。通过构建仿真平台功能模块,建造类别型录仿真网络与MFC消息映像表与映像链,重点论述了MFC消息路由仿真的具体实施方案,给出仿真的框架并进行仿真。从而验证了MFC的消息映像与消息路由机制。ClassTypeNetwork处于技术的中枢位置,在此基础上,我们可以完成运行时类型识别(RTTI),进而可以动态创建对象(DynamicCreation),后者又为数据的永久存储(Persistence)提供了可能。
关键词:消息映像,消息路由,动态创建,网络仿真,MFC
 

1. 引言

信息化的发展,对软件开发提出了更高的要求。Microsoft MFC应用程序框架为程序员提供了高效的开发平台,但也隐藏了很多细节。消息传递和路由网络是一个典型的范例。下面构造仿真平台,构建消息映像与消息路由网络,并给出console仿真。

2. 仿真平台功能模块

微软定义了若干宏,完成了对类别型录的封装,形成了一张巨大的类别型录网络(Class Type Network)。图1给出了几种技术的关系。Class Type Network处于技术的中枢位置,在此基础上,我们可以完成运行时类型识别(RTTI),进而可以动态创建对象(Dynamic Creation),后者又为数据的永久存储(Persistence)提供了可能。Windows借助于消息映像(Message Mapping)构造出消息映像表与消息映像链。消息路由(Message Routing) 描述了消息在各个对象之间的流动路径。发表论文。本文首先给出MFC型录网络的构建过程,然后完成Message Mapping和Message Routing的软件仿真。

 

图1 仿真平台功能模块

3. 仿真过程

3.1 类别型录仿真网络构建

类别型录网络记载MFC类库中所有类的信息,包括类的名称,类的大小,版本号,类的创建函数指针,及类的基类指针。发表论文。使用一个结构体CRuntimeClass表示,该结构体构成如下:

struct CRuntimeClass

{ LPCTSTR m_strClsName; //类名

UINTm_ObjSize; //类大小

UINTm_version; //类版本号

CObject*( *m_pfnCreateObj)(); //创建类的回调函数指针

CRuntimeClass* m_pBaseClass; //基类指针

staticCRuntimeClass* pFirstClass; //类链表表头

CRuntimeClass*m_pNextClass; //结构的next指针域

};

为每一个类都定义一个CRuntimeClass类型的静态结构成员。如为MFC的根类CObject类定义静态结构成员CObject::classCObject,为窗口类的根类CWnd定义静态结构成员CWnd::classCWnd,等等。每加入一个类均为该类定义这么一个静态结构成员。发表论文。终而,构成一个由CRuntimeClass::pFirstClass打头的类别型录网络。

 

图2 类别型录网络

基于类别型录网络,可以完成RTTI,即运行时类型识别,并可完成对象的动态创建(Dynamic Creation),水到渠成,Persistence是必然的结果。在MFC中,类别型录网络是通过宏DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC创建出来,类别型录网络的建立为消息映像和消息路由仿真奠定了基础。

3.2 MFC消息映像表与映像链的建立

为每一个类定义一个具有messageMap结构的消息映像表,如图3所示。该结构包括两个指针项,其一指向父类的消息映像表messageMap结构,另一个指针项指向一个数据类型为AFX_MSGMAP_ENTRY的结构数组,数组中的每一项均包含一个消息函数指针,指向一个类型为CCmdTarget的成员函数指针的消息回调函数。

然后,我们定义宏#define DECLARE_MESSAGE_MAP()

staticAFX_MSGMAP_ENTRY _messageEntries[];

staticAFX_MSGMAP messageMap;

virtualAFX_MSGMAP* GetMessageMap() ;

这样就声明了虚线框“①”中的数据结构。

 

图3 消息映像表数据结构

接着,需要填充图3虚框“①”中的数据结构内容,即要完成Item_1,Item_2,…,Item_n等的填充工作。同样,可以定义宏来完成,定义如下:

#defineBEGIN_MESSAGE_MAP(theClass, baseClass)

AFX_MSGMAP*theClass::GetMessageMap() const //⑴

{return &theClass::messageMap; }

AFX_MSGMAPtheClass::messageMap = //⑵

{&(baseClass::messageMap),

(AFX_MSGMAP_ENTRY* ) &(theClass::_messageEntries )

};

AFX_MSGMAP_ENTRY theClass::_messageEntries[] = //⑶

{

//BEGIN_MESSAGE_MAP宏结束

#defineON_COMMAND(id, memF)

{WM_COMMAND,0, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)memF

},

//ON_COMMAND宏结束

#defineEND_MESSAGE_MAP()

{0,0,0,0,Afxsig_end, (AFX_PMSG)0 }

};

//END_MESSAGE_MAP宏结束

定义了3个宏,实现了对消息映像表中数据结构内容的填充。其中第一个和第三个宏是必不可少的,而中间的宏ON_COMMAND(id,memFn)实现了对消息映射项Item_1的填充,是可选宏。但该宏实现了消息ID和处理函数memF的关联。

所以,MFC程序员只需要在类的头文件中声明DECLARE_MESSAGE_MAP()宏,便建立了图3虚框“①”中的数据结构。然后,在类的实现文件中加入:

BEGIN_MESSAGE_MAP(theClass,baseClass)

ON_COMMAND(id,memFn)

END_MESSAGE_MAP()

便完成了图3虚框“①”中的数据结构的填充。故而,在MFC的类层次结构中的所有可允许接收和处理消息的类中都加入相应的宏便可完成消息映像表和消息映像链的建立。

3.3 MFC消息路由仿真

现在消息映像表与消息映像链已经建立起来。消息进来之后,需要搞清楚在消息泵推动下的消息流动机制。

⑴ MFC对消息循环的处理规定

MFC对消息循环的处理是如下规定的:

①如果是一般的Windows消息(WM_xxx),则一定是由派生类流向基类。

②如果是WM_COMMAND消息,则有如下路线:

ⅰ若WM_COMMAND消息接收者为Frame窗口,则处理次序为:

View窗口→Frame窗口本身→CWinApp对象

ⅱ若WM_COMMAND消息接收者为View窗口,则处理次序为:

View本身→Document

ⅲ若WM_COMMAND消息接收者为Document,则处理次序为:

Document本身→Document Template

⑵消息路由仿真方案

基于3.2消息映像表及映像链的定义,依据3.3⑴MFC对消息循环的处理规定,设计消息路由仿真方案。图4给出了整个框架。

图4 消息路由仿真框架

图4分两类分别阐述了普通Window消息及WM_COMMAND命令消息的处理机制,给出了两类消息的路由过程。说明如下:

对于普通Windows消息,处理非常简单,仅需要遍历整个消息映像链。从派生类到基类,依次遍历类的消息映像表,查询消息映射项。若存在与消息对应的消息处理函数,则调用该消息处理函数,若无,则调用默认的消息处理函数DefWindowProc(),然后返回。

对于WM_COMMAND消息,处理起来,稍显复杂。视接收消息的对象不同,消息路由路径也不相同。若是CMyFrame框架窗口接收到命令消息,则需要分别从CMyView、CMyDocment、CMyFrame、CMyWinApp开始遍历消息映像链4次。图4已从CMyFrame开始标出了路由路径。若是CMyView视对象接收到命令消息,则需要分别从CMyView、CMyDocment开始遍历消息映像链2次。同样,图4已从CMyView开始标出了路由路径。若是CMyDocument接收到消息,则需从CMyDocment开始遍历消息映像链1次即可。

⑶ MFC console程序编写

首先,类别型录仿真网络;然后,建立消息映像表与映像链;接着,依据消息路由仿真方案编写MFC console仿真程序。经过仿真,实现了MFC运行时动态类型识别,实现了一般Windows消息的路由,并按规划方案实现了WM_COMMAND消息的消息路由,验证了MFC的消息路由机制。

4. 结论

通过设计类别型录仿真网络,构造消息映像表与映像链,并依据消息路由仿真方案设计console仿真程序。完成了对MFC的消息映像与消息路由的仿真,验证了MFC的消息映像与消息路由机制。对于深入了解MFC和Windows消息处理和健壮代码编程具有重要意义。


参考文献:
[1]谢裕敏等. MFC消息响应函数的逆向定位[J], 计算机应用. 2009(5):1394-1395
[2]侯俊杰.深入浅出MFC(第2版)[M].华中科技大学出版社,2001.
[3]郑小华. MFC消息映射机制探讨[J].软件导刊.2008(2):10-11
[4]张宇. MFC消息映射机制浅析[J]. 现代企业教育.2009(12):69-70
 

 

查看相关论文专题
加入收藏  打印本文
上一篇论文:MATLAB环境下振动力学虚拟教学实验软件的开发
下一篇论文:MIS系统在现代化管理中的应用
科技论文分类
科技小论文 数学建模论文
数学论文 节能减排论文
数学小论文 低碳生活论文
物理论文 建筑工程论文
网站设计论文 农业论文
图书情报 环境保护论文
计算机论文 化学论文
机电一体化论文 生物论文
网络安全论文 机械论文
水利论文 地质论文
交通论文
相关计算机论文
最新计算机论文
读者推荐的计算机论文