MFC中SHIFT+箭头多选后,SetItemState(-1,0,LVIS_SELECTED)首次调用无效问题
MFC虚拟列表视图取消选中状态的异常问题
问题复现步骤
- 创建默认MFC对话框应用,添加列表视图控件并关联
CListCtrl对象m_listCtrl - 开启虚拟列表模式(设置
LVS_OWNERDATA属性),同时启用多选和“Always show selection”选项 - 在
OnInitDialog()中添加至少一列,调用m_listCtrl.SetItemCount()设置多列表项 - 给按钮绑定点击事件,调用
m_listCtrl.SetItemState(-1, 0, LVIS_SELECTED);试图取消所有选中项 - 先点击某列表项,用SHIFT+箭头键扩展选中至少两项(鼠标、CTRL+点击/CTRL+SHIFT扩展则无此问题)
- 点击按钮,首次点击无法取消选中,第二次点击才生效
问题原因
这是虚拟列表视图控件的特殊行为,并非你的代码操作错误。当通过SHIFT+箭头键创建连续选择范围时,控件内部会维护一个选择锚点和范围状态,仅调用SetItemState(-1, 0, LVIS_SELECTED)只能清除单个项的选中标记,无法重置这个范围状态;第二次调用时,控件才会彻底识别到需要清除所有选择相关的内部状态。
解决方法
可以通过以下几种方式解决:
- 同时清除选中和焦点状态:
m_listCtrl.SetItemState(-1, 0, LVIS_SELECTED | LVIS_FOCUSED); - 先重置选择标记,再清除选中:
// 清除选择锚点 m_listCtrl.SendMessage(LVM_SETSELECTIONMARK, (WPARAM)-1, 0); // 取消所有选中 m_listCtrl.SetItemState(-1, 0, LVIS_SELECTED); - 使用
SetSelItems直接清空选中集合:m_listCtrl.SetSelItems(NULL, 0);
内容的提问来源于stack exchange,提问作者Igor Jerovsek
相关产品推荐
相关产品推荐

