MFC教程(4)-- 消息映射的实现(1)

消息映射的实现

Windows消息概述

Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。

消息的分类

队列消息和非队列消息

从消息的发送途径上看,消息分两种:队列消息和非队列消息。队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。

这里,对消息队列阐述如下:

Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。

鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。Windows每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。线程消息队列接收送给该线程所创建窗口的消息。线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。

除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。

这些队列消息以外的绝大多数消息是非队列消息。

系统消息和应用程序消息

从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。

系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。

时间: 2024-12-05 05:43:01

MFC教程(4)-- 消息映射的实现(1)的相关文章

MFC消息映射的原理:笔记

多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里面的每个类有很多成员函数(只说消息反映相关的成员函数啊),而且在派生类中,需要改写的也比较少(我用来做练习的程序就是那么一两个,呵呵).那么用c++的虚函数的实现机制会导致什么问题呢?就是大量虚表的建立使得空间浪费掉很多.   嗯-怎么办呢?于是各大c++名库(比如QT,MFC,VCL-)在消息映射

MFC教程(1)--MFC概述

MFC是一个编程框架 MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法.因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓.Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步

mfc-MFC关于消息映射冲突的问题

问题描述 MFC关于消息映射冲突的问题 如果两个消息同时发送给一个窗口,MFC中是同时执行这两个消息函数的么?那么局部变量的冲突怎么办? 解决方案 http://blog.csdn.net/andkobe/article/details/8687553 解决方案二: MFC中的消息映射MFC消息映射MFC中消息映射实例

MFC教程(4)-- 消息映射的实现(2)

但是在当前例子中,当前对象的类CTview没有覆盖该函数,所以CWnd的WindowProc被调用. 这个函数把下一步的工作交给OnWndMsg函数来处理.如果OnWndMsg没有处理,则交给DefWindowProc来处理. OnWndMsg和DefWindowProc都是CWnd类的虚拟函数. OnWndMsg的原型如下: BOOL CWnd::OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam,RESULT*pResult ); 该函数

mfc-谁能详细解释下MFC消息映射的原理是什么?

问题描述 谁能详细解释下MFC消息映射的原理是什么? 宏不是代码替换么?那么MFC是怎么把消息循环和消息处理函数对接在一起的?我想同时关联几个消息函数到一个消息,怎么做呢? 解决方案 http://www.cnblogs.com/lidabo/p/3694726.html

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

 ////////////////////////////////////////////////////////////////////////////////////                     /********* 文章系列:MFC技术内幕系列***********/                     /************MFC技术内幕系列之(四)***********/                     /*****文章题目:MFC消息映射与消息传递内幕**

剖析MFC六大关键技术(五六)--消息映射与命令传递

说到消息,在MFC中,"最熟悉的神秘"可算是消息映射,那是我们刚开始接触MFC时就要面对的东西.有过SDK编程经验的朋友转到MFC编程的时候,一下子觉得什么都变了样.特别是窗口消息及对消息的处理跟以前相比,更是风马牛不相及的.如文档不是窗口,是怎样响应命令消息的呢? 初次用MFC编程,我们只会用MFC ClassWizard为我们做大量的东西,最主要的是添加消息响应.记忆中,如果是自已添加消息响应,我们应何等的小心翼翼,对BEGIN_MESSAGE_MAP()--END_MESSAGE

MFC 消息映射表 及 相关宏定义

MFC相关技术说明:<可参阅MSDN MFC TNO 5> MFC 中通过通过不同于SDK的switch的方法来处理WINDOWS消息, 由消息映射表(Message Map)和虚函数多态来处理指定的窗体消息   1 声明一个消息映射表(Message Map) 在能处理消息的类中中添加宏 DECLARE_MESSAGE_MAP()   注 深入浅出MFC中有更详尽系统的概述 这里只介绍几个宏定义 这个宏实现了3个功能: 1 私有数据成员声明 AFX_MESSAGEMAP_ENTRY _mes

mfc-visual c++中,MFC的消息映射宏背后的实现原理搞不明白?有谁能解释一下宏的知识。

问题描述 visual c++中,MFC的消息映射宏背后的实现原理搞不明白?有谁能解释一下宏的知识. BEGIN_MESSAGE_MAP() ...... ON_COMMAND() ........ END_MESSAGE_MAP() 这背后怎么执行,生成的,完全不知所云,只是想了解一下的原理,这样用是会用,但是不明不白 的,心里有些疑惑. 解决方案 MFC消息映射BEGIN_MESSAGE_MAP详解 解决方案二: MFC消息映射BEGIN_MESSAGE_MAP详解,我就是看的这个,http