模仿MFC消息驱动机制
欢迎向我索要模仿MFC消息驱动的实例源码,希望能与更多的人讨论。
邮箱:wjh_2010@163.com
在微软推出的MFC架构中,其消息驱动机制是其精髓,使用简单,效率高,而且思路清晰。如果能够模拟MFC的消息驱动机制,并添加一些自己的消息映射(例如消息可以用字符串表示),那么在程序的移植上就会有非常大的帮助。
1.MFC消息的基本使用规则
A.定义自己的类,派生于CWnd,
B.在类的内部声明DECLARE_MESSAGE_MAP()
C.定义消息映射表:
BEGIN_MESSAGE_MAP(CChildView,CWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
分析这三个宏的定义,即可发现其消息映射表的实现规则(宏的定义请直接参考VS的工程)。
一个类的消息映射表的框图如下:
由于DECLARE_MESSAGE_MAP()声明的函数为虚函数,所以基类获得的消息映射表是最上层的映射表。在消息派发的时候,就可以先在子类的消息映射表中查找,查找不到再交给其基类处理,这样一直往底层派发。
2.实现MFC消息架构的基本原理
在C/C++中,基本上好的程序架构都离不开回调函数。MFC的消息架构也是如此,不过在C++中有虚函数的概念。因为回调函数能够解决模块间的耦合问题。
在MFC中定义消息映射的宏很多,例如ON_MESSAGE。每个消息映射都有一个类的成员函数,这函数就是回调函数。底层调用这些回调函数的时候能够实现像用对象调用这些函数一样,在函数中直接使用this指针。
MFC中,不同的消息映射,其实现的回调函数参数不一样。
实现MFC的消息架构需要实现的基本点如下:
A.回调函数调用类的成员函数,函数内部使用this指针;
B.根据不同的消息类型,给回调函数传入不同的参数;
C.对象的注册与注销,可能在消息函数中释放对象;
D.消息队列的处理与派发消息过程;
E.消息函数的重入问题;
对于A、B两点,在MFC的消息架构中可以看到其源码,可以参考消息映射宏的实现与CWnd::OnWndMsg函数的实现。
对于问题C,可以在基类的构造函数中实现注册,在析构函数中实现注销,对于对象的释放做出规定。
对于问题D,在消息队列中获得的消息,首先需要找到目标对象,然后再目标对象中查找对应的消息映射表,调用相应的回调函数。
在CWnd::OnWndMsg中如下语句说明了如何查找消息映射表。
for(/*pMessageMapalreadyinit'ed*/;pMessageMap->pfnGetBaseMap!=NULL;
pMessageMap=(*pMessageMap->pfnGetBaseMap)())
3.模拟MFC消息驱动机制
在MFC的消息机制中,一般在窗口类中实现消息的收发。自定义的类若不是派生于CWnd,则无法实现消息映射。并且发送消息必须有hwnd句柄(类对象直接调用send等函数则省略了该参数)。并且其消息映射只能使用整型数字,无法使用字符串来标志消息类型。
我们希望模拟MFC的消息机制,并扩展MFC的消息机制,实现如下功能:
A.定义整型的消息映射表
B.定义字符型的消息映射表
C.可以广播消息
D.可以通过对象名,而不单使用对象关联句柄发送消息。
定义带消息驱动的类:
classCCmdParser:publicCMsgBase
CCmdParser:类为自定义类,派生于CMsgBase即可实现消息映射。
CMsgBase:是所有消息类的基类,其构造函数和析构函数会实现对象的注册与注销。
如果CCmdParser需要实现自己的消息映射表,则在类中声明
//声明消息映射表
DECLARE_MFH_MESSAGE_MAP()
然后在类的实现中声明映射表:
//消息映射表
BEGIN_MFH_MESSAGE_MAP(CCmdParser,CMsgBase)
MFH_COMMAND("SLOGIN",&CCmdParser::DealLoginCommand)
MFH_COMMAND("SStartFileTransmit",&CCmdParser::DealLoginCommand)
MFH_BOARDCAST(MSG_CHECK_USER,&CCmdParser::DealCheckUser)
MFH_MESSAGE(MSG_START_SERVER,&CCmdParser::StartServer)
END_MFH_MESSAGE_MAP()
主程序的使用如下:
int_tmain(intargc,_TCHAR*argv[])
{
CCmdParser
parser;
parser.PostUserMessage(MSG_START_SERVER,NULL,NULL);
returnCMsgBase::Exec();
}
在模拟消息机制中主要需要实现sendMessage,PostMessage类似的函数和消息循环Exec()函数。
分享到:
相关推荐
MFC的消息机制的实现原理和消息处理的过程 对于MFC初学者可以很好了解其内部的运行机制 很好的资源
MFC消息响应机制分析,清晰地剖析了响应机制的原理
MFC消息响应机制及映射机制MFC消息响应机制及映射机制MFC消息响应机制及映射机制MFC消息响应机制及映射机制MFC消息响应机制及映射机制MFC消息响应机制及映射机制MFC消息响应机制及映射机制MFC消息响应机制及映射机制...
消息循环与消息泵(mfc消息循环机制详解),详细介绍mfc消息循环机理,个人觉得的很经典(有本人评点及注释),非常值得一下!
VC++的MFC类库实际上是Windows下C++编程的一套最为流行的类库。MFC的框架结构大大方便了程序员的编程工作,但是...这里我们简单的 分析MFC的消息响应机制,以了解MFC是如何对Windows的消息加以封装,方便用户的开发。
从实际应用入手,由浅入深、循序渐进地讲述Windows程序内部运行机制、MFC框架、文本、菜单、对话框、文件操作、网络编程、进程间通信、ActiveX控件、动态链接库、HOOK编程等多个主题。本书不同于一般的讲述VC++使用...
微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类库。...这里我们分析一下MFC的消息映射机制,以了解MFC是如何对Windows的消息加以封装,方便用户的开发。
深入解析MFC消息机制,包括消息处理等详细内容!
MFC消息响应机制
NULL 博文链接:https://sxjkk.iteye.com/blog/1172507
MFC消息映射机制的剖析 讲述如何运用ClassWizard part07上,MFC消息映射机制的剖析 讲述如何运用ClassWizard part07上,MFC消息映射机制的剖析 讲述如何运用ClassWizard part07上
很好很强大,将MFC框架原理以及消息运行机制讲解的十分透彻,让你有一种顿悟的感觉,千万别犹豫!!!
Windows-MFC程序-03.MFC消息映射机制与消息分类
MFC消息映射机制中构造数据类型的应用.pdf 这篇文章详细说明了MFC消息映射机制。
mfc消息映射机制及绘制曲线
本文档时候初学者,学习mfc,该文档把mfc的消息机制说的很透彻
MFC教程lesson 4-MFC消息映射机制.rar 包含课程内容、视频、PPT、笔记。内容详尽,MFC珍藏。
MFC中消息映射机制分析.doc
PPT中讲解了很有用的消息循环机制,我觉得对大家来说是很有帮助的。 MFC 消息采用了消息泵的机制,有效的理解消息原理!
MFC讲解消息映射的小例子,通过菜单选项讲解VC的消息映射原理