意识到我自己的理由太可疑后,我现在以不同的方式解决这个问题。但我还是很好奇...

出于怀旧、熟悉和懒惰的原因,我正在使用 MFC 编写 UI。出于可疑的原因(好像这些还不够),我想向组框添加(双击)事件。当然,组框包含一些东西 - 事实上,它包含另一个静态项目,我可以成功地向其中添加(双击)单击事件处理程序。

有什么原因导致我无法让事件处理程序为我的组框上的单击工作,就像我为简单文本静态项目执行此操作一样?无论在控件上、控件内或控件附近单击多少次都不会触发该事件。

注意 - 我已通读 http://www.codeproject.com/KB/static/staticctrl_tut.aspx 并尝试回复 ON_STN_...事件和 ON_BN_...消息,设置通知样式(BS_NOTIFY出现在rc文件中)...但我还是错过了一些东西——那是什么?有可能吗?我用谷歌搜索的大部分内容都表明它是......但没有 C++/MFC 的明确答案。

自从第一次发布这个问题以来,我发现了对 WM_NCHITTEST 消息的引用,并提示您必须为此消息创建一个处理程序以覆盖使用 HT_TRANSPARENT 响应的组框默认行为...尽管在 ClassWizard 中将其透明属性设置为 false。嗯。谁能确认这确实是关键吗?

有帮助吗?

解决方案

我认为 WM_NCHHITTEST/HT_TRANSPARENT 确实是这里的关键。

组框是一种奇怪的控件:虽然看起来它们包含其他控件,但它们实际上是 HWND 树中这些控件的兄弟姐妹。因此,看起来包含两个按钮的组框实际上是这些按钮的同级 - 并且可以位于 HWND 层次结构中的之前或之后。

组框以 HT_TRANSPARENT 响应 WM_NCHITTEST,以便鼠标单击可以直接穿过它们。这样做的好处之一是,组框位于它在窗口顺序中显示的控件之前还是之后并不重要。点击最终将被路由到这些控件,而不是组框。

要双击(或直接单击)组框即可工作,您需要执行两件事:

  • 覆盖默认的 WM_NCHITTEST 行为并返回 HT_CLIENT,就像常规控件一样
  • ;此时,它应该能够获取 WM_LBUTTONDOWN 和相关事件,否则这些事件将转移到其他地方(发送到同级或对话框本身)。
  • 确保组框的内容在 HWND z 顺序中位于其“之前”,以便它们不再依赖于“通过”组框的点击。(至少我认为你希望它们在之前;无论哪种方式,您可能需要使用 HWND 排序,因为它再次变得重要。)

请注意,这又是与 WS_EX_TRANSPARENT 不同的透明度类型,WS_EX_TRANSPARENT 可能是透明类向导属性映射到的类型。简单来说,HT_TRANSPARENT 与对鼠标透明有关;WS_EX_TRANSPARENT 更多的是最后绘制,以便兄弟姐妹“显示出来”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top