c++ - 向静态组合框控件添加单击/双击事件

标签 c++ mfc event-handling groupbox

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

出于怀旧、熟悉和懒惰的原因,我正在使用 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 和相关事件,否则这些事件会在其他地方发生(给 sibling ,或对话本身)。
  • 确保组框的内容在 HWND z 顺序中*先于*它,这样它们就不再依赖于“通过”组框的点击。 (至少我认为您希望它们是以前的样子;无论哪种方式,您可能都需要使用 HWND 排序,因为它又很重要了。)

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

关于c++ - 向静态组合框控件添加单击/双击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2541714/

相关文章:

c++ - OwnerDraw CButton mfc 焦点

c++ - CAtlMap 使用 CString 作为键

events - 使用Node.JS进行键盘事件模拟

javascript - ExtJs 6.0 - Ext.application 内的 Javascript 事件处理函数作用域

c++ - 声明一个可以将lambda用作参数的函数,但该lambda必须能够捕获其他变量

c++ - 如何正确分解代码?

c++ - stringstream 问题 - vector 迭代器不可取消引用

c++ - 按 Enter 后如何防止命令行关闭

mfc - 如何将tchar指针转换为char指针

javascript - ReactJS - 如何检测何时在文件输入上单击取消?