【问题标题】:WM_NOTIFY and superclass chaining issue in Win32Win32 中的 WM_NOTIFY 和超类链接问题
【发布时间】:2009-04-17 01:51:07
【问题描述】:

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

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

单个超类:

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

超类的超类:

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

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

【问题讨论】:

    标签: c++ c winapi wndproc


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 2013-07-29
        • 2017-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多