C++ 虚拟ListView不希望出现的复选框行为使用ListView\u HitTest检查LVHT\u ONITEMSTATEICON标志和扩展样式LVS\u EX\u 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之前,我的代码工作得很好(只有在单击复选框时才选中/取消选中)。

我正在使用一个虚拟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扩展样式的情况下实现此功能(仅在单击复选框时切换)

编辑:


启用
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破译这个页面:。这似乎表明,hittesting
LVS\u EX\u FULLROWSELECT
LVHT\u OnItemStateCon
确实需要特殊处理。
if ( (hitInfo.flags & LVHT_ONITEM) != LVHT_ONITEM ) {
    if ( (hitInfo.flags & LVHT_ONITEMSTATEICON) != 0 ) {
        ToggleCheckBox( item, hwndLstView );
    }
}