【问题标题】:How does one tell when the state of a child window changes in WTL?如何判断 WTL 中子窗口的状态何时发生变化?
【发布时间】:2011-12-10 08:42:01
【问题描述】:

我已经使用 WTL 编写了一个简单的 GUI:

就设置窗口而言,我已经弄清楚了一切,并且还连接了菜单等以调用我想要的任何东西。但我需要知道,例如,何时有人选中列表视图中的复选框之一,或何时有人点击按钮。

这些子窗口是否向主窗口发送消息通知状态更改,并且该通知在子窗口类型之间是否大体一致?

【问题讨论】:

  • 如果你用 WTL 编程,你最好的朋友就是 Spy++。记住它! :-)(它是 Visual Studio 中包含的一个工具。我认为它没有安装在“标准”安装中)
  • @xanatos:我该怎么处理它? :P
  • 你启动它 :-) 你启动你想要监视的应用程序。你做 Window->Refresh 只是为了确定。 Spy->Log Messages,您使用 Finder 工具“查找”您的窗口(通常您选择控件的父级),您从 Message 选项卡中选择的所有消息开始,然后执行 Ok。然后您会看到它正在捕获 100 万条无用的消息并开始禁用它们(WM_MOUSEMOVE、WM_MOUSELEAVE...)(您可以右键单击消息并选择停止记录消息)。您将发现“旧”Winapi 控件背后的世界。 WPF/Silverlight 控件是另一个世界。
  • 其他可能性(通常更好)。您从“窗口”窗口开始。窗口->刷新。您使用“查找窗口”按钮。你找到了你的窗口的控件。好的。在属性检查器中单击同步。现在控件在 Window 窗口中被“选中”。从那里您可以查找它的父母/孩子/兄弟姐妹,右键单击其中之一,消息。

标签: c++ winapi wtl


【解决方案1】:

子通知通常以WM_NOTIFYWM_COMMAND 消息的形式发送到父窗口。

一些子通知在大多数控件类型(例如NM_CLICKNM_CUSTOMDRAW)中都很常见,但通常您需要查看 MSDN 上每种控件类型的通知参考以了解可用的内容。首先,列表视图通知的引用是here,按钮通知是here

【讨论】:

  • 不普遍。一些通知(主要是较旧的)通过WM_COMMAND 发送。
  • @Billy :标准列表视图控件通过 LVS_EX_CHECKBOXES 扩展样式支持复选框。我没有查看 WTL 源代码,但我认为它使用了上述样式,而不是做任何自定义。
  • 我将 /universally/ 编辑为 / 通常 / 因为偶尔会有例外,例如 WM_HSCROLL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多