Message Reflection for Windows Controls(消息反射机制)

https://msdn.microsoft.com/en-us/library/eeah46xd.aspx

转自: //http://blog.csdn.net/zhuce0001/article/details/9152515.

在基于对话框的程序中,有一个任务是改变编辑框控件的背景,怎么办?

实现思路如下,子控件要绘制时会向父类(这里是主窗口)发送WM_CTLCOLOR

消息,在父类中(这里是主窗口)响应WM_CTLCOLOR,根据消息传递过来的

参数进行相应的操作,具体代码如下:

[cpp] view plain copy

  1. CBrush m_brush;

[cpp] view plain copy

  1. m_brush.CreateSolidBrush(RGB(0, 0, 255));

[cpp] view plain copy

  1. HBRUSH CMy112Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  2. {
  3. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  4. if (pWnd->GetDlgCtrlID() == IDC_EDIT1)
  5. {
  6. pDC->SetBkMode(TRANSPARENT);
  7. return m_brush;
  8. }
  9. return hbr;
  10. }

代码解释如下:在主对话框类CMy112Dlg中定义一个成员变量m_brush,并在主对话

框类中的构造函数中进行初始化。然后为父类编写WM_CTLCOLOR,在消息响应中判断

控件是否为要设置的编辑框控件(要设置的编辑框控件ID为IDC_EDIT1)将背景模式设

置为透明,并设置控件背景为蓝色。

这和消息反射有什么关系呢?上述代码有问题吗?上述方法也不失为一种好方法,但从

软件工程角度看还有一些缺憾,子类控件的消息都要父类去处理,这样就会导致父类

中的代码臃肿,而子类无事可做。另一方面,如果其它的工程要用到类似功能,怎么办?

只好把上述函数代码拷贝到另外工程中,并进行稍微修改。

MFC4.0开始有了解决此问题的一种新方法:消息反射,以上面为例,子控件要绘制时,

会向父类发送要绘制的消息,父类收到消息后,首先反射(再发给)给子控件,看子控件

是否对此消息做了处理,如果做了处理,父类将不再处理。如果子控件没有处理,则

父类对子控件发送的消息做处理。

再看一下上面例子的另一种方法:消息反射法

为工程添加一处新类CYellowEdit,此类从MFC的CEdit类派生,为类添加三个成员变量

[cpp] view plain copy

  1. COLORREF m_clrText;
  2. COLORREF m_clrBkgnd;
  3. CBrush   m_brBkgnd;

分别是文本颜色,背景色,画刷,在CYellowEdit类构造函数中进行初始化

[cpp] view plain copy

  1. CYellowEdit::CYellowEdit()
  2. {
  3. m_clrText = RGB(0, 0, 0);
  4. m_clrBkgnd = RGB(255, 255, 0);
  5. m_brBkgnd.CreateSolidBrush(m_clrBkgnd);
  6. }

为CYellowEdit类添加反射函数(消息前面带有=的是反射消息,本例中为=WM_CTRLCOLR,

[cpp] view plain copy

  1. HBRUSH CYellowEdit::CtlColor(CDC* pDC, UINT nCtlColor)
  2. {
  3. pDC->SetTextColor(m_clrText);    // 文本颜色
  4. pDC->SetBkColor(m_clrBkgnd);     // 背景色
  5. return m_brBkgnd;                // 控件背景
  6. }

在主对话框上再添加一个编辑框,并为之关联变量,关联变量类型为CYelloEdit,运行程序可

以看到编辑框的背景已变成黄色了。

这就是消息反射的一个用处,使用消息反射和不使用消息反射这两个例子有什么区别呢?个

人认为最大的区别就是代码的可重用性,使用消息反射后,如果碰到类似应用,直接将

CYellowEdit拷贝到其它工程直接应用,不需要修改代码。

上述例子在MSDN中有详细介绍,在MSDN中主题为:ON_NOTIFY_REFLECT,

里面有一篇

TN062: Message Reflection for Windows Controls

的文章专门讲述了消息反射。网上也有不少这方面的文章,但基本上都是参考MSDN翻译的,

下面给出几个消息反射资料的博文地址

1    http://blog.csdn.net/gao_zilai/article/details/7417690

2    http://blog.csdn.net/cay22/article/details/6171616

3    http://bbs.ednchina.com/BLOG_ARTICLE_1926378.HTM

时间: 2024-11-05 16:39:20

Message Reflection for Windows Controls(消息反射机制)的相关文章

深度剖析消息反射机制

深度剖析消息反射机制作者:hustli    摘要:在前面我们分析了控件通知消息WM_NOTIFY,和WM_NOTIFY紧密联系的还有一个MFC新特性:消息反射.本文中,我想就这个问题作一个全面的论述,如果有错误,还望各路大虾批评指正.    什么是消息反射?    在windows里面,子控件经常向父控件发送消息,例如很多子控件要绘制自己的背景,就可能向父窗口发送消息WM_CTLCOLOR.对于从子控件发来的消息,父控件有可能在处理之前,把消息返还给子控件处理,这样消息看起来就想是从父窗口反射

Win32消息循环机制等【转载】http://blog.csdn.net/u013777351/article/details/49522219

Dos的过程驱动与Windows的事件驱动 在讲本程序的消息循环之前,我想先谈一下Dos与Windows驱动机制的区别: DOS程序主要使用顺序的,过程驱动的程序设计方法.顺序的,过程驱动的程序有一个明显的开始,明显的过程及一个明显的结束,因此程序能直接控制程序事件或过程的顺序.虽然在顺序的过程驱动的程序中也有很多处理异常的方法,但这样的异常处理也仍然是顺序的,过程驱动的结构. 而Windows的驱动方式是事件驱动,就是不由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程

Windows程序消息机制浅析

1.消息  消息是由MSG结构体来表示的.如下: 1 typedef struct tagMSG { 2 HWND hwnd; 3 UINT message; 4 WPARAM wParam; 5 LPARAM lParam; 6 DWORD time; 7 POINT pt; 8 } MSG 2.WinMain函数的定义 WinMain函数的原型声明如下: 1 int WINAPI WinMain( 2 HINSTANCE hInstance, // handle to current ins

Java反射机制(Reflection)

Java反射机制(Reflection) 一.反射机制是什么 Java反射机制是程序在运行过程中,对于任意一个类都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法和属性,这种动态获取类信息以及动态调用对象方法的功能就是JAVA语言的反射机制. 二.反射机制能干什么 (1)在运行时判断任意一个对象所属的类 (2)在运行时构造任意一个类的对象 (3)在运行时判断任意一个类所具有的成员变量和方法 (4)在运行时调用任意一个对象的方法 (PS:注意反射机制都是在程序运行时,而不

理解Windows消息循环机制

理解消息循环和整个消息传送机制对Windows编程十分重要.如果对消息处理的整个过程不了解,在windows编程中会遇到很多令人困惑的地方. 什么是消息(Message)每个消息是一个整型数值,如果查看头文件(查看头文件了解API是一个非常好的习惯和普遍的做法)可以发现如下一些宏定义: #define WM_INITDIALOG                   0x0110 #define WM_COMMAND                      0x0111 #define WM_L

windows程序消息机制(Winform界面更新有关)--转

1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源.这里的While循环使用了GetMessage() 这个方法,这是个阻塞方法,也就是队列为空时方法就会阻塞,从而这个While循环停止运动,这避免了一个程序把cpu无缘无故的耗尽,让其他程序难以得到响应.当然在某些需要cpu最大限度运动的程序里面就可以使用另外的方法,例如某些

windows程序消息机制(Winform界面更新有关)

windows程序消息机制(Winform界面更新有关) 转自:http://www.cnblogs.com/blosaa/archive/2013/05/31/3109586.html 1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源.这里的While循环使用了GetMessage() 这个方法,这是个阻塞方法,也就是队列

Java进阶之reflection(反射机制)——反射概念与基础

反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见的JavaScript就是动态语言,除此之外Ruby,Python等也属于动态语言,而C.C++则不属于动态语言. 二.Java是动态语言吗? 从动态语言能在运行时改变程序结构结构或则变量类型上看,Java和C.C++一样都不属于动态语言. 但是JAVA却又一个非常突出的与动态相关的机制:反射机制.

第一章 Windows程序内部运行机制(3)消息与消息队列

在Windows中,用户程序可以调用系统的API函数,系统也会调用用户程序,这个调用时通过消息来进行的. Windows程序设计是一种事件驱动方式的程序设计模式,主要基于消息. [例]当用户在窗口中画图的时候,按下鼠标左键,操作系统就会感知到这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息进行响应.在处理过程中,操作系统会给应用程序“发送消息”.“发送消息”实际上是指操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程. 1.消息