CListCtrl 怎么禁用鼠标停留指定项目后,自动高亮
时间: 2024-10-21 11:01:22 浏览: 20
VC++ CListCtrl自绘改变字体及背景颜色和高亮显示
CListCtrl默认行为是当鼠标悬停在列表项上时会自动高亮以表示当前焦点。要禁用这种自动高亮效果,你需要阻止LVN_HITTEST消息的某些部分。以下是一个简单的示例:
1. **防止LVHT_ONITEMSTATEICON标志触发**[^1]:
当鼠标点击在 checkbox 上面时(LVHT_ONITEMSTATEICON),你可以手动控制这个事件。例如,在`OnItemStateChanged`或其他适当的回调中,你可以这样处理:
```cpp
void MyCListCtrl::OnItemStateChanged(NMHDR *nmhdr, LRESULT *pResult)
{
NM_LISTVIEW* nmlv = reinterpret_cast<NM_LISTVIEW*>(nmhdr);
if (nmlv->iItem != -1 && (nmlv->uNewState & LVIS_STATEIMAGEMASK) == LVIS_SELECTED) {
// 如果是checkbox被点击,取消高亮
SetItemState(nmlv->iItem, 0, LVIS_SELECTED);
}
else if (item != -1 && (hitinfo.flags & LVHT_ONITEMSTATEICON) != 0) {
ToggleCheckBox(item);
}
*pResult = 0;
}
```
2. **禁用LVN_ITEMCHANGED消息**:
可能还需要在`OnItemChanged`事件中设置`LVIF_NOINVALIDATE`标志来避免不必要的重绘。这将防止列表控件因状态改变而自动更新外观。
通过这些调整,你就限制了鼠标停留在列表项上时的自动高亮行为。然而,如果你希望保留其他交互功能,比如仅针对checkbox的交互,记得适当地调用`ToggleCheckBox`函数。
阅读全文