2

意识到我自己的理由太可疑了,我现在换了一种不同的方式。但我还是很好奇...

出于怀旧、熟悉和懒惰的原因,我正在使用 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 中设置了它的透明属性为假。嗯。谁能确认这确实是关键?

4

1 回答 1

1

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

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

组框以 HT_TRANSPARENT 响应 WM_NCHITTEST,以便鼠标单击直接通过它们。这样做的一个好处是,组合框出现在它似乎包含在窗口顺序中的控件之前还是之后都没有关系。点击最终将被路由到这些控件,而不是 groupbox。

要在 groupbox 上双击(或直接单击)工作,您需要做两件事:

  • 覆盖默认的 WM_NCHITTEST 行为并返回 HT_CLIENT,就像常规控件一样
  • ; 在这一点上,它应该能够获得 WM_LBUTTONDOWN 和相关事件,否则这些事件会在其他地方(兄弟姐妹或对话框本身)。
  • 确保 groupbox 的内容在 HWND z 顺序中出现在 *before* 它之前,这样它们就不再依赖于“通过”groupbox 的点击。(至少我认为您希望它们在以前;无论哪种方式,您可能需要使用 HWND 排序,因为它再次很重要。)

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

于 2011-04-03T14:58:48.543 回答