将单击/双击事件添加到静态组框控件

时间:2010-03-29 22:37:50

标签: c++ mfc event-handling groupbox

意识到自己的原因太可疑了,我现在已经采取了不同的方式。但我还好奇......

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

我是否有任何理由无法使用事件处理程序为我的组框上的点击工作,就像我对简单文本静态项目一样?控件内或附近的任何数量的点击都不会触发事件。

注意 - 我已阅读http://www.codeproject.com/KB/static/staticctrl_tut.aspx并尝试回复ON_STN _...事件和ON_BN _...消息,设置通知样式(BS_NOTIFY出现在rc文件中)......仍然是我我错过了什么 - 它是什么?它甚至可能吗?我用google搜索的大部分内容都表明它是......但没有明确的C ++ / MFC答案。

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

1 个答案:

答案 0 :(得分:1)

我认为WM_NCHHITTEST / HT_TRANSPARENT确实是关键所在。

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

组框使用HT_TRANSPARENT响应WM_NCHITTEST,以便鼠标单击直接通过它们。这样做的一个好处是,组合框是否出现在它看起来包含在窗口顺序中的控件之前或之后;点击最终将被路由到这些控件,而不是路由到组框。

要在组合框上双击(或只是单击)工作,您需要做两件事:

  • 覆盖默认的WM_NCHITTEST行为,而是像常规控件一样返回HT_CLIENT
  • ;在这一点上它应该能够获得WM_LBUTTONDOWN和相关的事件,否则这些事件将转移到其他地方(对于兄弟或对话本身)。
  • 确保组合框的内容在HWND z顺序中*之前*,以便它们不再依赖于通过组框的点击。 (至少我认为你希望它们在之前;无论哪种方式,你可能需要使用HWND命令,因为它再次显着。)

请注意,这是WS_EX_TRANSPARENT的另一种透明度,它可能是Transparent class向导属性映射到的。大致简化,HT_TRANSPARENT与鼠标透明有关; WS_EX_TRANSPARENT更多的是关于最后绘制,以便兄弟姐妹“透视”。