CListControl的OnMouseMove和OnNcHitTest

本文介绍如何将CListCtrl控件实现为菜单样式,并处理鼠标移入移出时的选中状态变化。通过对比使用WM_NCHITTEST消息与OnMouseMove事件结合PtInRect方法的不同效果,解释了为何采用后者能避免选中状态意外丢失的问题。

实际案例如下:

 

将CListCtrl做成菜单样式。需要处理当鼠标移到ClistCtrl上的事件。

处理逻辑这样:当鼠标移动到CListCtrl区域时候,将CListCtrl上所有ITem置为非选中状态,然后调用HitTest得到行数再将所选行置为选中状态。当鼠标移出ClistCtrl区域时候,将原来选中状态不变。

 

 

 

在实际做的过程中,在判断鼠标是否移到CListCtrl客户区域时候,误用WM_NCHITTEST消息判断,在OnNcHitTest里面处理选中逻辑。导致每次鼠标移出ClistCtrl会偶尔出现原来选中的行选中状态会消失。PS:SetItemState(i, 0, -1) 取消选中状态

 

 

后来在OnMouseMove处理,通过PtInRect判断鼠标在客户区,当在客户区的时候再处理逻辑,效果实现。

 

 

原因是由于鼠标在移出ClistCtrl区域的时候,偶尔会接触到CListCtrl的边界,触发WM_NCHITTEST,由于在OnNcHitTest的逻辑判断是将所有行置为非选中状态,并且所选行为-1,所以出现上述现象就不足为奇了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值