Win32中的WM_NOTIFY和超类链接问题

时间:2009-04-17 01:51:07

标签: c++ c winapi wndproc

作为参考,我正在使用this文章中概述的窗口超类方法。如果我想从超类中的基本控件处理WM_NOTIFY消息(即自定义绘图),则需要从父窗口反映它们或将我自己的窗口设置为父窗口(在内部传递CREATESTRUCT WM_(NC)CREATE到基类)。如果我有一个超类,这种方法可以正常工作。如果我超类我的超类,那么我遇到了一个问题。现在3个WindowProcs在同一个HWND中运行,当我反映WM_NOTIFY个消息(或者让它们从上面的父技巧发送给我自己)时,它们总是转到最外层(最派生的)WindowProc。我无法判断它们是否是针对内部超类的消息(基本消息应该转到第一个超类)或者是用于外部超类的消息(来自内部超类的消息是针对外部超类的)。这些消息无法区分,因为它们都来自具有相同控制ID的相同HWND。有没有办法解决这个问题,而无需创建一个新的窗口来封装每个级别的继承?

对文字墙感到抱歉。这是一个难以解释的概念。这是一个图表。

单个超类:

SuperA::WindowProc() -> Base::WindowProc()---\
             ^--------WM_NOTIFY(Base)--------/

超类的超类:

SuperB::WindowProc() -> SuperA::WindowProc() -> Base::WindowProc()---\
             ^--------WM_NOTIFY(Base)--------+-----------------------/
             ^--------WM_NOTIFY(A)-----------/

第二种情况下的WM_NOTIFY消息都来自相同的HWND和控制ID,因此我无法区分用于SuperA(来自Base)的消息和用于SuperB(来自SuperA)的消息。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

当然,控件(原始?)正在向PARENT发送消息。据推测,您正在拦截这些并将它们发布回原始控件。外层当然会先看到它们(然后如果它不想处理它们就可以传递它们。)

您还没有说过要拦截哪种NOTIFY消息或为什么。但是,既然您现在可以在父proc中控制它们以将它们重新发送,为什么不只是更改消息。滚动您自己的NMHDR结构,嵌入消息和数据,并为超类的级别添加一些标识。在你的超类中,剥掉你想要的那些,重新格式化你不需要的那些,然后发送它们。

听起来有点混乱。在那个级别,我倾向于回到基础并建立我自己的共同控制(当然,取决于你实际上要做的事情)。

答案 1 :(得分:1)

Borland通过更改父级别的消息ID来解决这个问题。当父窗口收到WM_NOTIFY消息时,消息ID将按定义的偏移(CN_BASE)递增,然后消息将直接传递到消息指定的子窗口。然后子窗口过程(以及子窗口的任何子类)可以查找(CN_BASE + WM_NOTIFY)消息并访问原始WM_NOTIFY数据。同样的技术也适用于WM_COMMAND消息。尝试在代码中做类似的事情。