科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件深度剖析消息反射机制

深度剖析消息反射机制

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在Windows里面,子控件经常向父控件发送消息,例如很多子控件要绘制自己的背景,就可能向父窗口发送消息。

作者:hustli 来源:论坛 2007年10月22日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
消息处理的过程

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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章