Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > 分析与理解消息反射机制vc++技术(转载)
【标  题】:分析与理解消息反射机制vc++技术(转载)
【关键字】:vc++
【来  源】:http://blog.csdn.net/bodybo/archive/2006/08/17/1089936.aspx

分析与理解消息反射机制vc++技术(转载)

Your Ad Here

郑力群
前言:

我曾写过一篇文章对通知消息WM_NOTIFY进行分析,消息反射是MFC中对通知消息的处理方式,两者之间关系十分紧密,因此,我写了这篇文章,希望能够描绘出通知消息的完整印象。

消息反射的基础知识

1、消息反射解释:
  父窗口将控制子窗口发给它的通知消息,首先反射回子窗口进行处理(即给控制子窗口一个机会,让控制子窗口处理此消息),这样通知消息就有机会能被子窗口自身进行处理。

2、MFC中引入消息反射的原因:
  在Windows的消息处理中,控制子窗口的发给其父窗口的通知消息只能由其父窗口进行处理,这使得控制子窗口的自身能动性大大降低(你想,它连改变自己的背景色,处理一个自身滚动问题都要其父窗口来完成),为了解决这个问题,在MFC中引入了反射消息“Reflect Message”的概念,进行消息反射,可以使得控制子窗口能够自行处理与自身相关的一些消息,增强了封装性,从而提高了控制子窗口的可重用性。

消息反射的处理流程(不考虑OLE控制)

一、消息反射处理流程图:
  1、父窗口收到控制子窗口发来的通知消息后,调用它的虚函数CWnd::OnNotify.
CWnd::OnNotify()主体部分:
{
if (ReflectLastMsg(hWndCtrl, pResult)) //此时,hWndCtrl,为发送窗口,即子窗口的窗口句柄
return TRUE; // 子窗口已处理了此消息
AFX_NOTIFY notify;
notify.pResult = pResult;
notify.pNMHDR = pNMHDR;
return OnCmdMsg(nID, MAKELONG(nCode, WM_NOTIFY), ¬ify, NULL);
}

  分析:首先,调用ReflectLastMsg(hCtrlChildWnd,...)给子窗口一个自身处理的机会,将消息反射给子窗口处理,函数返回TRUE,表明子窗口处理了此消息。反之,表示子窗口未处理此消息,此时,调用OnCmdMsg(...)由父窗口进行通常的处理。

  2、ReflectLastMsg中:
  主要是调用发送窗口的SendChildNotifyLastMsg(...)。

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


二、消息处理

方式1:
  由上述处理流程可以看出来,子窗口要想自身处理此消息,重载子控件窗口的OnChildNotify虚拟函数应该是很容易想到的方式。

  注意:MFC中对各个子控件窗口一般都已经重载了OnChildNotify函数,它对应调用类的虚函数进行处理,所以,你重载对应的虚函数即可,如下例:
BOOL CStatusBarCtrl::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam,LRESULT* pResult)
{
if (message != WM_DRAWITEM) //对应不同的控制,会有不同的有特殊处理要求的消息。
return CWnd::OnChildNotify(message, wParam, lParam, pResult);
...
...
DrawItem((LPDRAWITEMSTRUCT)lParam);
return TRUE;
}
virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
void CStatusBarCtrl::DrawItem(LPDRAWITEMSTRUCT)
{
ASSERT(FALSE); // must override for self draw status bars
}

  你重载CSTatusBarCtrl类的DrawItem虚拟函数,即可实现对反射消息WM_DRAWITEM的处理。

方式2:
  从方式1可以看出,如果你不在被重载的OnChildNotify中对消息进行处理,函数会调用CWnd::OnChildNotify,它调用ReflectChildNotify函数进行标准的处理。
1、增加反射消息的映射入口。
2、增加对应的消息处理函数。
注意:可以使用MFC的ClassWizard作上述动作,在ClassWizard中,可处理的反射消息以一个"="号以示区别。返回值为TRUE,表示控件窗口已处理此反射消息,为FALSE,表示控件子窗口未处理此反射消息

结语:

  消息反射不是很难的概念。它仅出现在MFC中;它的用意是方便控制子窗口的重用;对某些通知消息你可以重载对应的虚函数(WM_DRAWITEM...)进行处理;对其它你可以使用标准的消息反射映射进行处理。限于篇幅,一些细节问题,请阅读MFC中对应的源代码。 
 

一个托盘程序演示 -闹钟 Alert(转载):【上一篇】
个性新闻自动采集系统:【下一篇】
【相关文章】
  • MS VC++ 6.0 fatal error C1010的解决方法
  • 用VC++建立Service服务应用程序
  • 用VC++制作QQ自动登陆软件
  • VC++实现文件夹时间属性的获取与更改(转载)
  • 将程序图标填加进任务栏(VC++6.0)
  • 读VC++内幕之体悟 - 10
  • [老文章]使用VC++开发PHP扩展注意事项[摘抄]
  • VC++网络游戏建模与实现
  • 孙鑫VC++笔记
  • 最常见的20种VC++编译错误信息
  • 【随机文章】
  • 如何在pb9中调用WebService
  • 关于在.net中web表单 在textbox 中回车页面提交问题的解决方案
  • Matlab 符号微积分
  • 巧用颜色选择控件
  • 网络专业人士笔记(7)
  • 实现页面图片阴影特效
  • 产品生命周期管理:(三)选择PLM供应商建议
  • EJB(Enterprise JavaBeans)入门(2)
  • VB/ASP 调用 SQL Server 的存储过程
  • [转载]谈PHP生成静态页面 模板+缓存+写文件
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.