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

对不起,文字墙。这是一个很难解释的概念。这是一个图表。

单个父类(super class):

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

父类(super class)的父类(super class):

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

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

最佳答案

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

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

听起来确实有点乱。在那个级别,我倾向于回到基础并建立自己的共同控制(当然,这取决于您实际尝试做什么)。

关于c++ - Win32 中的 WM_NOTIFY 和父类(super class)链接问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/758714/

10-15 00:38