我有一个简单的ListView,实际上是创建一个MxN网格。 “FullRowSelect”已关闭。基本上我们有一个细胞网格。
我试图找出鼠标是否在包含Item的单元格上,如果是,那么它是什么项目。
GetItemAt(...)接近我想做的事情,但并不完全。如果“单元格”中有文本,则GetItemAt()返回该项。问题是,如果它在单元格上方,但实际上不在单元格中的文本上,则返回null。
我很难过。任何人都可以帮助我吗?
答案 0 :(得分:1)
ListView存在关于命中测试的错误/“功能”。
如果FullRowSelect
为false
且该点位于单元格0上但未打开
文本或图标GetItemAt()
不会注册。
解决此问题的一种方法是截取低级LVM_HITTEST
消息,打开FullRowSelect
,执行正常的LVM_HITTEST
处理,然后再关闭FullRowSelect
。这种工作但可能搞砸了工具提示
潜在的控制。
更简单的方法是使用ObjectListView(.NET ListView周围的开源包装器),它已经使用标准ListView
解决了这个问题(以及其他一些问题)。
我是这个控件的作者所以,是的,我有偏见,但不一定是不准确的。)