如何将 CListCtrl 中的项目设置为选中?

Posted

技术标签:

【中文标题】如何将 CListCtrl 中的项目设置为选中?【英文标题】:How to set an item in CListCtrl as selected? 【发布时间】:2009-11-13 13:42:19 【问题描述】:

ClistCtrl 在报表视图中设置为单选和单列,没有标题。

我尝试过SetItemState(0,LVIS_SELECTED,LVIF_STATE)SetSelectionMark(int index),但这些都不起作用。

【问题讨论】:

【参考方案1】:

您还需要在更新项目状态后调用 SetSelectionMark。

SetItemState(prev_item, ~LVIS_SELECTED, LVIS_SELECTED);
SetItemState(new_selected_item, LVIS_SELECTED, LVIS_SELECTED);
SetSelectionMark(new_selected_item);

【讨论】:

【参考方案2】:

使用 SetItemState(0, LVIS_SELECTED, LVIS_SELECTED) 突出显示,以及 SetItemState(0, ~LVIS_SELECTED, LVIS_SELECTED) 取消突出显示。

【讨论】:

【参考方案3】:

只需将 Properties->Appearance->Always Show Selection 设置为 TRUE

【讨论】:

这为我解决了这个问题,虽然不是通过 GUI。如果您以编程方式创建列表视图控件,则要设置的样式为LVS_SHOWSELALWAYS【参考方案4】:

我认为SetItemState 函数有一个未记录的功能,您可以将-1 作为其nItem 参数传递,以使函数作用于所有项目。

所以,如果你只想选择只有一个,我可以建议:

    SetItemState(-1, 0, LVIS_SELECTED);
    SetItemState(index, LVIS_SELECTED, LVIS_SELECTED);

更新:

(看到http://www.verycomputer.com/417_11fcb075491b88c9_1.htm#p3之后)

SetItemState 函数发送 LVM_SETITEMSTATE 消息,并且 nItem=-1 功能记录在 message's reference documentation 作为其 wParam 参数。

【讨论】:

谢谢,macro 中还有更多信息。【参考方案5】:

假设要选择的item的索引是w_nCurIdx,使用如下代码

m_pSPSMapList.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
m_pSPSMapList.SetItemState(w_nCurIdx, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);

【讨论】:

【参考方案6】:

如果您不会在 OnInitialDialog 中设置所选项目,请使用以下代码:

m_pSPSMapList->EnsureVisible(nItem, FALSE);
m_pSPSMapList->SetFocus();
m_pSPSMapList->SetItemState(nItem, LVIS_FOCUSED | LVIS_SELECTED, 
                                   LVIS_FOCUSED | LVIS_SELECTED);

return FALSE; // OnInitialDialog necessarily must return false

【讨论】:

以上是关于如何将 CListCtrl 中的项目设置为选中?的主要内容,如果未能解决你的问题,请参考以下文章

ClistCtrl 设置项目的颜色

更改 CListCtrl 中的特定项目颜色?

如何在 CListCtrl 中为单个项目加下划线

MFC CListCtrl 将一个列表的选中项添加到另一个列表

ClistCtrl用法及总结(由怎样隐藏ListCtrl列表头的排序小三角形这个bug学习到的知识)

如何将项目插入到 CListCtrl 的第二列