【问题标题】:Adding click/double-click events to static group box controls将单击/双击事件添加到静态组框控件
【发布时间】:2010-03-29 22:37:50
【问题描述】:

意识到我自己的理由太可疑了,我现在换了一种方式来解决这个问题。但我还是很好奇……

出于怀旧、熟悉和懒惰的原因,我正在使用 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。嗯。谁能确认这确实是关键?

【问题讨论】:

    标签: c++ mfc event-handling groupbox


    【解决方案1】:

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

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

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

    要让双击(或直接单击)组框起作用,您需要做两件事:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 2014-01-23
      • 2018-09-19
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多