C++ 虚拟ListView不希望出现的复选框行为使用ListView\u HitTest检查LVHT\u ONITEMSTATEICON标志和扩展样式LVS\u EX\u FULLROWSELECT
我正在使用一个虚拟ListView控件,并试图使复选框正常工作。在NM_CLICK中,我的代码将单击点从NM_LISTVIEW结构复制到LVHITTESTINFO hitInfo.pt。然后我将hitInfo传递给ListView\u HitTest,如果hitInfo.flags&LVHT\u ONITEMSTATICON->ToggleCheckBox 在我将扩展样式LVS_EX_FULLROWSELECT添加到ListView之前,我的代码工作得很好(只有在单击复选框时才选中/取消选中)。现在,如果我选择一行(在项目的任何点),它将切换复选框 是否有任何方法可以在不删除LVS_EX_FULLROWSELECT扩展样式的情况下实现此功能(仅在单击复选框时切换) 编辑:C++ 虚拟ListView不希望出现的复选框行为使用ListView\u HitTest检查LVHT\u ONITEMSTATEICON标志和扩展样式LVS\u EX\u FULLROWSELECT,c++,windows,winapi,C++,Windows,Winapi,我正在使用一个虚拟ListView控件,并试图使复选框正常工作。在NM_CLICK中,我的代码将单击点从NM_LISTVIEW结构复制到LVHITTESTINFO hitInfo.pt。然后我将hitInfo传递给ListView\u HitTest,如果hitInfo.flags&LVHT\u ONITEMSTATICON->ToggleCheckBox 在我将扩展样式LVS_EX_FULLROWSELECT添加到ListView之前,我的代码工作得很好(只有在单击复选框时才选中/取消选中)。
启用
LVS\u EX\u FULLROWSELECT
时,点击测试报告LVHT\u ONITEM
,它是LVHT\u ONITEMICON
、LVHT\u ONITEMLABEL
和LVHT\u onitemstate图标的组合。您需要过滤掉该条件,例如:
if ( (hitInfo.flags & LVHT_ONITEM) != LVHT_ONITEM ) {
if ( (hitInfo.flags & LVHT_ONITEMSTATEICON) != 0 ) {
ToggleCheckBox( item, hwndLstView );
}
}
你能发布第一段提到的代码吗?@user1793036当然,我已经更新了帖子。你的问题不清楚你是否使用了LVS\u EX\u复选框。你能澄清一下吗?@RogerRowland是的,我正在使用LVS_EX_CHECKBOXESTry破译这个页面:。这似乎表明,hittestingLVS\u EX\u FULLROWSELECT
和LVHT\u OnItemStateCon
确实需要特殊处理。
if ( (hitInfo.flags & LVHT_ONITEM) != LVHT_ONITEM ) {
if ( (hitInfo.flags & LVHT_ONITEMSTATEICON) != 0 ) {
ToggleCheckBox( item, hwndLstView );
}
}