【问题标题】:How to find out which window triggered WM_PARENTNOTIFY?如何找出哪个窗口触发了 WM_PARENTNOTIFY?
【发布时间】:2020-06-19 06:05:24
【问题描述】:

当我将一个按钮(A)的父级设置为另一个按钮(B)时,我发现它不会触发按钮A的WM_COMMAND消息,并且会收到WM_PARENTNOTIFY消息窗口(按钮 A 的父级)。但是查了reference之后,发现没有办法得到按钮B的身份,比如HMENU或者HWND。有人可以帮我吗?

【问题讨论】:

  • 您是否想知道按钮何时被点击?不要为此使用 WM_PARENTNOTIFY。
  • 你到底想在这里做什么?您是否知道将这些消息发送到控件的父级是正常的?这种行为当然是有记录的。
  • 为什么要在按钮里面放一个按钮?那会遇到各种各样的问题。例如,键盘访问将被搞砸。 (问题的答案是按钮 B 会将其 WM​​_COMMAND 发送到窗口 A。子类窗口 A 来获取它。)
  • @RaymondChen 非常感谢您查看问题并给出答案。请问这样可以获取HMENU、HWND等按钮B的信息吗?
  • 隐含发送者:如果您在子类按钮 A 中处理 WM_COMMAND,则它源自按钮 B。如果您在按钮 A 的父级中处理 WM_COMMAND,您知道它来自按钮 A。

标签: c++ windows user-interface winapi frontend


【解决方案1】:

是的,有人将一个按钮放入另一个按钮,或者说将一个按钮的父级设置为另一个按钮,这确实很奇怪,但是当父级按钮的样式为BS_GROUPBOX时,它确实具有一些现实意义,就像 Visual Basic 中的 Frame

img_button_in_button

我对这个问题的解决方案是在创建一个新控件后调用SetWindowSubClass,这样调用这个API时设置的新回调函数就可以接收到触发这个事件的控件的真实hWnd。

需要说明的一点:

  • 如果控件不处理该事件,请使用return DefSubclassProc(hWnd, uMsg, wParam, lParam);

  • 删除那些调用SetWindowSubClass的控件的WS_CHILD样式,否则这些控件将无法正确显示,唯一显示的只是一个空窗口。

感谢所有在这个问题上帮助我的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2011-04-16
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    相关资源
    最近更新 更多