MFC中消息响应机制

由于视类窗口始终覆盖在框架类窗口之上,因此所有操作,包括鼠标单击、鼠标移动等操作都只能由视类窗口捕获。一个MFC消息响应函数在程序中有三处相关信息:函数原型、函数实现和以及用来关联消息和消息响应函数的宏。
(1)在消息响应函数的原型代码中,函数声明的前部有一个afx_msg限定符,也是一个宏,该宏表明这个函数是一个消息响应函数的声明。
(2)消息映射宏:在视图类的源文件中,BEGIN_MESSAGE_MAP()和
END_MASSAGE_MAP()这两个宏之间定义了消息映射表,例如对于画线,其中有一个ON_WM_LBUTTONDOWN()消息映射宏,这个宏
的作用就是把鼠标左键按下消息(WM_LBUTTONDOWN)与一个消息响应函数关联起来,通过这种机制,一旦有消息产生,程序就会调用相应的消息响应
函数来进行处理。
(3)消息响应函数的定义:在视图类的源文件中,可以看到
OnLButtonDown函数的定义。头文件中在两个AFX_MSG注释宏之间是消息响应函数原型的声明。源文件中有两处:一处是在两个
AFX_MSG_MAP注释宏之间的消息映射宏,通过这个宏把消息与消息响应函数关联起来;另一处是源文件中的消息响应函数的实现代码。
   
在Win32应用程序中,当有消息产生时,操作系统会把这条消息放到应用程序的消息队列中,应用程序通过GetMessage函数从这个队列中取出一条具
体的消息,并通过DispatchMessage
函数把消息交给操作系统,调用的是应用程序的窗口过程,即窗口过程函数WndProc进行处理,然而在MFC程序中,并不是按这种途径进行处理的,
只要定义了与消息有关的三处信息后,便可实现消息的响应处理.MFC中采用的这种消息处理机制称为MFC消息映射机制.
   
MFC消息映射机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表.在消息映射表中,消息与对应的消
息处理函数指针是成对出现的.某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中.当有消息需要处理时,程序只要搜索该消
息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息.如果能处理此消息,则同样依照静态表能很容易找到并调用对应的消息处理函数.

MFC消息映射机制的实际实现过程:MFC在后台维护了一个窗口句柄与对应的C++对象指针的对照表,以例中的CDrawView类为例,与
CDrawView对象相关的有一个窗口,窗口当然有它的窗口句柄,该句柄与CDrawView对象的一个指针(即CDrawView*)存在一一对应关
系,在窗口句柄与C++对象对照表中就维护了这种对应关系.当收到某一个消息时,消息的第一个参数就指明了该消息与哪个窗口句柄相关,通过对照表,就可以
找到与之相关的C++对象指针.然后把这个指针传递给应用程序框架窗口类的基类,后者会调用一个名为WindowProc函数,该函数定义位于
WinCore.cpp中.CWnd::WindowProc函数内部调用了一个OnWndMsg函数,真正的消息路由,也就是消息映射是由此函数完成
的.OnWndMsg函数的处理过程:首先判断消息是否有消息响应函数.判断方法是在相应窗口类中查找所需的消息响应函数.因为传递给
WindowProc的是窗口子类指针,OnWndMsg会到相应的子类头文件中查找,看看DECLARE_MESSAGE_MAP()宏之上,两个
AFX_MSG注释宏之间是否有相应的消息响应函数原型的声明;再到子类的源文件中,看看BEGIN_MESSAGE_MAP()和
END_MESSAGE_MAP()两个宏之间是否有相应的消息映射宏.如果通过上述步骤,找到了消息响应函数,接着就调用该响应函数,对消息进行处理.
如果在子类中没有找到,那么就交由基类进行处理.通过以上步骤,MFC就实现了具体的消息映射,从而完成对消息的响应

时间: 2024-10-12 07:42:58

MFC中消息响应机制的相关文章

MFC消息响应机制分析

---- 摘要: ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了系统的分析,可以帮助程序开发人员对MFC的消息映射机制有一个比较透彻的了解. ---- 关键词:面向对象 消息映射 MFC 程序设计 一.引言---- VC++的MFC类库实际上是Windows下C++编程的一套最为流行的类库.MFC的框架结构大大方便了程序员的编程工作,但是为了更加有效.灵活的使用MFC编程

MFC消息响应机制 q

MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows API函数和Windows控件,使得程序的开发变得简单,极大的缩短了程序的开发 周期.MFC独创的Document/View框架结构,能够将管理数据的代码和显示数据的程序代码分开,并且设计了 一套方便的消息映射和命令传递机制,方便程序员的开发使用.其中消息映射机制本身比较庞大和复杂,对 它的分析和了

关于OC中消息转发机制的理解以及在项目中的实际应用

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">关于OC中的消息转发机制想必大家都很了解,现在来温习一下:</span> 一.什么是消息转发? @selector 是什么? 1一种类型 SEL 2代表你要发送的消息(方法), 跟字符串有点像, 也可以互转.: NSSelectorFromString()   /   NSS

MFC中消息映射的实现

知识是从一本书上看到并总结的,书名:MFC Windows程序设计(第2版).[美]Jeff Prosise著 北京博彦科技发展有限责任公司 译 对于捕获窗口事件并添加事件处理函数的过程可以有以下两种方式的实现(以鼠标单击事件为例): 1. H文件添加: protected: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() CPP文件添加: BEGIN_MESSAGE_MAP(子类名, 基类

MFC编程入门之五(MFC消息映射机制概述)

在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什么是消息?  窗口消息一般由三个部分组成:1.一个无符号整数,是消息值:2.消息附带的WPARAM类型的参数:3.消息附带的LPARAM类型的参数.其实,我们一般所说的消息是侠义上的消息值,也就是一个无符号整数,经常被定义为宏. 二.什么是消息映射机制?  MFC使用一种消息映射机制来处理消息,在应

VS2010/MFC编程入门之五(MFC消息映射机制概述)

VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html     上一讲鸡啄米为大家简单分析了MFC应用程序框架,这一讲是关于MFC消息映射机制的内容.        前面已经说过,Windows应用程序是消息驱动的.在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的

MFC的消息机制

MFC的消息循环(::GetMessage,::PeekMessage)消息泵(CWinThread::PumpMessage)和MFC的消息在窗口之间的路由是两件不同的事情 分两个步骤完成: 1 "消息派送":非对话框程序(MFC Doc/View架构)和对话框程序略有不同,但原理相差不大.但除了少数的消息例如WM_QUIT,所有消息的派送流程基本一致.2 "消息路由":其中消息分有3种类型,各类型的路由过程不一样.非对话框程序和对话框程序的处理相同. 消息派送消

深度解析VC中的消息传递机制

摘要:Windows编程和Dos编程,一个很大的区别就是,Windows编程是事件驱动,消息传递的.所以,要学好Windows编程,必须 对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面的分析. 一.什么是消息? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定 义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键 都会使Windows发送一个

消息映射机制

消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉. 一个消息,是系统定义的一个32位的值,它唯一地定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了. 例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序. 消息可以由系统或者应用程序产生. 系统在发生输入事件时产生消息. 举个例子, 当用户敲键, 移动鼠标或者单击控件. 系统也产生消息以响应由应用程序带来的变化, 比如应用程序改变系统字体改变窗体大小. 应用程序可