3

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

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

单个超类:

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

超类的超类:

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

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

4

2 回答 2

1

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

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

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

于 2009-12-05T07:39:20.267 回答
1

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

于 2010-04-30T00:37:47.863 回答