【问题标题】:How can I detect if the mouse is over an item/subitem in a List View control?如何检测鼠标是否在列表视图控件中的项目/子项目上?
【发布时间】:2014-10-10 18:38:55
【问题描述】:

我四处搜索,但没有找到一个对我来说听起来合理或似乎与我的特定问题相关的解决方案(即使在 Stack Overflow 上也是如此)。

问题很简单:我有大部分工作需要在列表视图的任何单元格上进行自定义复选框;我只需要检测悬停/悬停即可绘制热门图像。这些图像被设置为控件的状态图像表,所以我想在悬停和单击时更改子项状态。

我尝试使用NM_HOVER,但在完成所有工作以使其正常工作后,它没有工作。经过进一步研究,似乎只有在LVS_EX_TRACKSELECT 开启时才会发布,这是我不想要的;我只想处理悬停,而不是在悬停时选择!

我研究过使用 NM_HOTTRACKNM_ACTIVATE,但这只能给我一半的答案:我不知道所有项目何时停止悬停(以冷化最后一个热门项目)。

我发现了一些 CodeProject 项目,它使用内部工具提示做一些古怪的事情。我根本不想接触内部数据结构。

我的列表视图是子类。我需要 Common Controls 6。我需要在 XP 或更新版本上运行(尽管将来也可以接受特定于 Vista 的选项)。

我在这里有什么选择吗?谢谢。

【问题讨论】:

  • 那么你想用复选框做什么?
  • 如果您的列表视图是子类,那么您可以访问您需要的消息 - WM_MOUSEMOVE
  • @colepanike:在任何列上实现复选框,而不仅仅是第一个:S
  • @JonathanPotter:嗯,让我们看看...
  • flags 字段在LVM_HITTESTLVM_SUBITEMHITTEST 返回时为您设置 - 您无需自己设置。

标签: c listview winapi


【解决方案1】:

由于您有列表视图的子类,您可以观察WM_MOUSEMOVE 消息以检测鼠标在控件上移动。

根据您的要求,您可能还想使用TrackMouseEvent 来捕捉鼠标离开窗口的时间。

【讨论】:

  • 是的,我需要做TrackMouseEvent;我只是不知道这样做是否会通过列表视图践踏任何私有实例。走着瞧。再次感谢!
  • 据我所知,如果启用了LVS_EX_TRACKSELECT,则列表视图仅使用TrackMouseEvent,尽管当然这在将来总是会改变。
猜你喜欢
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多