设为首页 加入收藏

TOP

深度剖析消息反射机制(二)
2012-11-04 15:26:15 来源: 作者: 【 】 浏览:352
Tags:深度 剖析 消息 反射 机制
  消息处理的过程

  (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",运行,看到了什么?

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC实现系统热键激活后台服务程序 下一篇VC面向对象开发分析与设计实例解析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: