C++ Win32中的WM_通知和超类链接问题
作为参考,我使用了本文中概述的窗口超类方法。如果我想处理来自超类中基控件的C++ Win32中的WM_通知和超类链接问题,c++,c,winapi,wndproc,C++,C,Winapi,Wndproc,作为参考,我使用了本文中概述的窗口超类方法。如果我想处理来自超类中基控件的WM_NOTIFY消息(即,对于自定义图形),则会出现特定问题,我需要从父窗口将它们反射回来,或者将我自己的窗口设置为父窗口(在CREATESTRUCT中为WM_u(NC)CREATE传递给基类)。如果我有一个超类,这个方法就可以很好地工作。如果我对我的超类进行超类化,那么我就会遇到问题。现在3个WindowProc在同一个HWND中运行,当我反射WM_NOTIFY消息(或让它们从上面的父技巧发送给我自己)时,它们总是转到
WM_NOTIFY
消息(即,对于自定义图形),则会出现特定问题,我需要从父窗口将它们反射回来,或者将我自己的窗口设置为父窗口(在CREATESTRUCT中为WM_u(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(Base)--------+-----------------------/
^--------WM_NOTIFY(A)-----------/
SuperA::WindowProc()->Base::WindowProc()---\
^--------WM_通知(基本)--------/
超类的超类:
SuperA::WindowProc() -> Base::WindowProc()---\
^--------WM_NOTIFY(Base)--------/
SuperB::WindowProc() -> SuperA::WindowProc() -> Base::WindowProc()---\
^--------WM_NOTIFY(Base)--------+-----------------------/
^--------WM_NOTIFY(A)-----------/
超级::WindowProc()->SuperA::WindowProc()->Base::WindowProc()---\
^--------WM_通知(基本)--------+-----------------------/
^--------WM_通知(A)-----------/
第二种情况下的WM_NOTIFY
消息都来自相同的HWND和控件ID,因此我无法区分用于Super(来自Base)的消息和用于Super(来自Super)的消息。有什么想法吗?当然,控件(原始?)正在向父级发送消息。您可能正在拦截这些内容并将其发回原始控件。外层当然会先看到这些(如果它不想处理它们的话,可以直接传递它们)
您还没有说明要拦截哪种类型的通知消息或原因。但是,既然您现在可以在父进程中控制它们以将它们发送回,为什么不更改消息呢。滚动您自己的NMHDR结构,嵌入消息和数据,并为超类的级别添加一些标识。在你的超类中,剥离你想要的,重新格式化你不想要的,然后发送它们
听起来确实有点乱。在这个级别上,我倾向于回到基础,构建自己的通用控件(当然,这取决于您实际尝试的操作)。Borland通过在父级更改消息ID,在VCL中解决了这个问题。当父窗口接收到WM_NOTIFY消息时,消息ID按定义的偏移量(CN_基)递增,然后消息直接传递给消息指定的子窗口。然后,子窗口过程(以及子窗口的任何子类)可以查找(CN_BASE+WM_NOTIFY)消息并访问原始WM_NOTIFY数据。同样的技术也适用于WM_命令消息。尝试在代码中执行类似的操作