科技行者

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

知识库

知识库 安全导航

至顶网软件频道基础软件分析与理解VC的通知消息WM_NOTIFY

分析与理解VC的通知消息WM_NOTIFY

  • 扫一扫
    分享文章到微信

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

我写了这篇文章,将我对WM_NOTIFY消息的理解阐述如下.

作者:郑力群 来源:天极网 2007年10月19日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
WM_NOTIFY为何能完成如此的重任?

  原因:它扩展了消息的lParam参数,使它成为指向一个相对统一的结构的指针,从而使用这个结构来传递复杂的信息。

  1、无需附加的信息时:

 此结构为一个NMHDR结构:

NMHDR
{
HWnd hWndFrom ; //相当于原WM_COMMAND传递方式的lParam
UINT idFrom ; //相当于原WM_COMMAND传递方式的wParam(low-order)
UINT code ; //相当于原WM_COMMAND传递方式的Notify Code(wParam"s high-order)
}

  2、需要附加的信息时:

  此结构为一个大的结构,它的首成员必须为一个NMHDR结构的对象,它的其他成员放置此消息的附加信息。

  以LVN_KEYDOWN为例:

typedef struct tagLVKEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} NMLVKEYDOWN, FAR *LPNMLVKEYDOWN;

  WM_NOTIFY消息的处理(以LVN_KEYDOWN 为例)

void C*ListCtrl::OnKeydown(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
....
....
}

  分析

  1、大结构的首个成员为NMHDR,这样,使用指向NMHDR的指针来传递结构地址,不论在仅使用NMHDR结构,还是在使用大结构的情况下都适合。

  2、因为此消息实际传递的即是对应的结构(NMHDR或以NMHDR作首成员的大结构)所以,如上进行强制转换,当然不会有问题。

  结束语

  使用上述WM_NOTIFY框架处理的消息很多,它们的处理架构与一般的消息处理类似,因此,本文没有对它的具体使用进行阐述,有着方面需求的读者,请自行参阅MSDN相关内容。

  另外,WM_NOTIFY消息和“消息反射”的关系十分紧密,我会尽快将我对“消息反射”的理解与分析,写出来与大家共享,再次感谢大家对本文的关注。

查看本文来源

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

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

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