AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

深度剖析消息反射机制

51自学网 2015-08-30 http://www.wanshiok.com

  消息处理的过程

  (1)子窗口向父窗口发送通知消息,激发父窗口去调用它的虚函数CWnd::OnNotify。大致的结构如下:

BOOL CWnd::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
if (ReflectLastMsg(hWndCtrl, pResult)) file://hWndCtrl,为发送窗口
return TRUE; file://如果子窗口已处理了此消息,返回
AFX_NOTIFY notify;
notify.pResult = pResult;
notify.pNMHDR = pNMHDR;
return OnCmdMsg(nID, MAKELONG(nCode, WM_NOTIFY)? notify:NULL);
}

  (2)ReflectLastMsg声明如下:

static BOOL PASCAL ReflectLastMsg(HWND hWndChild, LRESULT* pResult = NULL);

   它的主要任务就是调用发送窗口的SendChildNotifyLastMsg。

  (3)SendChildNotifyLastMsg声明如下:

BOOL SendChildNotifyLastMsg(LRESULT* pResult = NULL);

   调用发送窗口的虚函数OnChildNotify函数,进行处理。 如果发送窗口没有进行重载处理,则调用ReflectChildNotify(...)函数进行标准的反射消息的消息映射处理。

  使用的一个例子

  这里面我们举一个简单的例子,希望大家能够更清晰的掌握消息反射机制。

  (1)创建一个基于对话框的工程。

  (2)利用向导创建一个新的类:CMyEdit,基类是CEdit。

  (3)在CMyEdit头文件中加入3个成员变量:

COLORREF m_clrText ;
COLORREF m_clrBkgnd ;
CBrush m_brBkgnd;

  (4)利用向导在其中加入WM_CTLCOLOR(看到了么,前面是不是有一个=?),并且将它的函数体改为:

HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
pDC->SetTextColor( m_clrText ); // text
pDC->SetBkColor( m_clrBkgnd ); // text bkgnd
return m_brBkgnd; // ctl bkgnd
}

  同时我们在.cpp文件中会看到ON_WM_CTLCOLOR_REFLECT(),这就是我们所说的经过处理的宏,是不是很符合规则?

  (5)在对话框中加入一个Edit,增加一个关联的变量,选择Control属性,类别为CMyEdit。

  (6)在对话框.cpp文件中加入#include "MyEdit.h",运行,看到了什么?

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:VC实现系统热键激活后台服务程序  下一篇:VC面向对象开发分析与设计实例解析