c++ - Win32 中的 WM_NOTIFY 和父类(super class)链接问题

标签 c++ c winapi wndproc

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

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

单个父类(super class):

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

父类(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 消息或原因。但是,由于您现在可以在父过程中控制它们以将它们发送回去,为什么不直接更改消息。滚动您自己的 NMHDR 结构,嵌入消息和数据,并为父类(super class)的级别添加一些标识。在你的父类(super class)中,剥离你想要的,重新格式化你不需要的,然后继续发送。

听起来确实有点乱。在那个级别,我会倾向于直接回到基础并构建我自己的通用控件(当然,这取决于您实际尝试做什么)。

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

相关文章:

c++ - 在类中使用 fstream getline() 函数

c++ - 如何将 float 作为模板参数传递?

c - 三元运算符的使用 : var ? 12-var : 0

c - LIRC 零键代码 0x10001d0f

c++ - 用 OpenGL 绘制三角形 : how to manage with two classes

c++ - 将对象存储在 vector 中, vector 在 C++ 中的映射中

c++ - 如何使用指定的编译器(例如 GCC)安装 Boost

c - sleep 指令不适用于信号处理程序

C++ 异步运行一个函数而不阻塞用户界面

winapi - 在C++、WinAPI中如何知道进程是否在Windows中运行?