【问题标题】:How To Capture Mouse Movement Over Caption Bar In C++ Win32?如何在 C++ Win32 中捕获字幕栏上的鼠标移动?
【发布时间】:2013-12-19 14:47:49
【问题描述】:

我有一个自定义的窗口标题栏。我还在这个栏上画了一个位图,我想知道何时有人用鼠标光标悬停在它上面。我已经处理了WM_NCMOUSEMOVE 消息,但这似乎只在边界触发,而不是我的标题区域本身。

如何检测鼠标何时在标题栏的某个区域上?

这适用于 Visual C++ 2010。

更新:

我已经在一定程度上解决了这个问题。我(故意)没有在窗口上设置WS_CAPTION 样式,而是处理WM_NCCALCSIZE 并手动调整非客户区的大小——在这种情况下将其向下移动20 个像素。这意味着我“强制”作为非客户区的区域不会收到WM_NCMOUSEMOVE 消息,但也不会收到WM_MOUSEMOVE 消息。一种方法是强制WM_CAPTION 样式,摆脱我在WM_NCCALCSIZE 上的自定义代码,但这并不理想。有办法解决吗?

更新2:

WM_NCHITTEST 消息也是同样的问题。除非我设置了我不想要的 WS_CAPTION 样式集,否则该区域不会触发这些。它也以某种方式影响客户区,因为它不再收到WM_LBUTTONDOWN 消息。

【问题讨论】:

  • 你确定你的层次结构中没有窗口捕捉到那些 WM_NCMOUSEMOVE 消息吗?您是否在窗口上尝试过 Spy++(来自 Visual Studio 工具)?
  • 您应该处理 WM_NCHITTEST 消息并使其在适当时返回 HTCAPTION
  • Oring 与未知值不是我所说的“精确”:-) 所以你的 Window 不是桌面的主 Window 子窗口?
  • 我认为是时候停止cmets 20题的游戏,坚持看SSCCE了。
  • @Tim 请告诉我们:您的窗口是您的另一个窗口的子窗口,还是您打算使其成为顶级窗口?

标签: c++ winapi visual-c++


【解决方案1】:

我不太肯定你的意思,但我认为你是说你想检查标题栏的某个部分是否被鼠标悬停。如果是这样,那么也许可以尝试跟踪窗口大小和位置,然后检查相对于您的窗口位置和大小,栏的该部分是否会被鼠标悬停(以像素为单位)。这是我能想到的唯一不使用操作系统特定功能的方法,我尽量避免。

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多