您的位置:首页 > 其它

MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕

2007-12-20 15:16 330 查看
引言:
Windows操作系统是以消息为基础,事件驱动的。作为程序员了解操作系统的消息传递机制是非常必要的。Microsoft的MFC又它自己的一套支持Windows操作系统消息机制的技术--消息映射(Message Mapping)和命令传递(Command Routing),在这篇文章中我就详细的挖掘一下MFC的消息映射技术以及命令传递技术。

正文:
///////////////////////////////////////////////
/* 1.Windows消息概览 */
//////////////////////////////////////////////
对于消息,程序员应该不陌生。WM_CREATE,WM_PAINT等等都是Windows程序设计中必不可缺少的组成部分。大多有关MFC Win32编程的书籍都将Windows消息分为三大类即:
* 标准消息: 任何以WM_开头的消息(WM_COMMAND除外);如:WM_QUIT,WM_CREATE;
* 命令消息: WM_COMMAND;
* 子窗口通知: 由子窗口(大多为控件)产生并发送到该控件所属的父窗口的消息。(注意:此类消息也 以WM_COMMAND形式出现)
消息类型我们已经了解了,下面我们就来看看消息映射是如何工作的:
//////////////////////////////////////////////////////
/* 2.MFC消息映射网的组成元素 */
//////////////////////////////////////////////////////
我的前几篇文章中涉及到了MFC内部建立的一些“网”技术,比如“执行期类型识别网”等,这回我们将建立一个消息映射网,这个网的建立与前面相同的是它也利用了一些神秘的宏。下面我们就来掀开它们的神秘面纱。
我们先简单地看看这些宏在程序源文件中的什么地方?
//in xx.h
class theClass
{
...//
DECLARE_MESSAGE_MAP()
};
//in xx.cpp
BEGIN_MESSAGE_MAP(theClass, baseClass)
ON_COMMAND( ID_MYCMD, OnMyCommand )
ON_WM_CREATE()
END_MESSAGE_MAP()
...//

这些宏的定义如下:
//in Afxwin.h
#define DECLARE_MESSAGE_MAP() /
private: /
static const AFX_MSGMAP_ENTRY _messageEntries[]; /
protected: /
static const AFX_MSGMAP messageMap; /
static const AFX_MSGMAP* PASCAL GetThisMessageMap(); /
virtual const AFX_MSGMAP* GetMessageMap() const; /

#define BEGIN_MESSAGE_MAP(theClass, baseClass) /
const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() /
{ return &theClass::messageMap; } /
const AFX_MSGMAP* theClass::GetMessageMap() const /
{ return &theClass::messageMap; } /
AFX_COMDAT const AFX_MSGMAP theClass::messageMap = /
{ &baseClass::GetThisMessageMap, &theClass::_messageEntries[0] }; /
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = /
{ /

#define END_MESSAGE_MAP() /
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } /
}; /
DECLARE_MESSAGE_MAP()宏为每个类添加了四个东东,包括那个重要的消息映射表messageMap和消息入口结构数组AFX_MSGMAP_ENTRY _messageEntries[];BEGIN_MESSAGE_MAP(theClass, baseClass)和END_MESSAGE_MAP()宏则初始化了它们,随后我将带领大家看看这个初始化过程。

///////////////////////////////////////////////
/* 3.MFC消息映射表 */
//////////////////////////////// //////////////
我自已架设了博客,文章已转到个人博客,欢迎交流!

MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
http://www.jeanva.cn/post/50.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: