MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
来源:互联网 发布:网络有利有弊 英语翻译 编辑:程序博客网 时间:2024/06/09 00:35
引言:
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
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- MFC---- MFC技术内幕系列之消息映射与消息传递
- MFC消息映射与消息传递内幕
- MFC消息映射与消息传递内幕
- MFC消息内幕
- MFC技术内幕系列
- MFC复习(五)MFC消息映射与消息传递
- MFC技术内幕系列之(二)---MFC文档视图
- MFC技术内幕系列之(三)----MFC执行期类型识别与动态创建技术内幕
- MFC技术内幕系列之(三)----MFC执行期类型识别与动态创建技术内幕
- MFC技术内幕系列之(三)---MFC执行期类型识别与动态创建技术内幕
- MFC技术内幕系列之(二)---MFC文档视图结构内幕
- MFC技术内幕系列之(三)----MFC执行期类型识别与动态创建技术内幕
- ado.net获取存储过程的返回值
- 算法擂台代码:时间表达
- PB开发者的好工具-PB源代码比较器
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
- 为GridView的删除行添加删除确认
- 一种可以穿透还原卡和还原软件的代码
- MFC技术内幕系列之(五)---MFC文档序列化内幕
- 孙卫琴Hibernate第四章对象-关系映射基础
- LINQ初探
- linux下安装mplayer
- 为JAVA而担忧
- 穿衣指引