C++ ListView隐藏项

Dan*_*Dan 2 c++ windows winapi listview

我创建了几乎标准的ListView.

    RECT rec;
    GetClientRect(hwnd, &rec);
    ListView = CreateWindow(WC_LISTVIEW, (LPCSTR)L"", (WS_CHILD | WS_VISIBLE | LVS_REPORT), 0, 0, rec.right, rec.bottom-23, hwnd, (HMENU)8553, GetModuleHandle(NULL), NULL);
    SendMessage(ListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES); // Set style
Run Code Online (Sandbox Code Playgroud)

现在我插入几个这样的列:

    LVCOLUMNW listColumnW = { 0 };
    listColumnW.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    listColumnW.pszText = L"Column1";
    listColumnW.cx = 150;
    listColumnW.fmt = LVCFMT_LEFT;
    SendMessage(ListView,LVM_INSERTCOLUMNW, 0, (LPARAM)&listColumnW);
Run Code Online (Sandbox Code Playgroud)

之后我会检查项目和子项目

    LVITEMW lisW = { 0 };
    lisW.mask = LVIF_TEXT | LVIF_PARAM;
    lisW.pszText = item_text[i];
    lisW.iItem = i;
    lisW.lParam = i;
    SendMessage(ListView, LVM_INSERTITEMW, 0, (LPARAM)&lisW);
Run Code Online (Sandbox Code Playgroud)

现在我想实现某种搜索/过滤.我看到很多人建议删除/重新插入项目,但是因为我的列表视图中有很多项目不是最佳解决方案.谷歌搜索时我了解到应该可以设置groupid并设置项目状态(隐藏它).但是我不确定如何做到这一点,让我说我的listview中有10个项目,我想要隐藏一些项目,我到底该怎么做?

编辑:

我已经设置了LVM_ENABLEGROUPVIEW并创建了两个组,一个应该显示,另一个隐藏.

    LVGROUP group = { 0 };
    group.cbSize = sizeof(LVGROUP);
    group.mask = LVGF_GROUPID;
    group.iGroupId = 10;//shown
    ListView_InsertGroup(ListView, -1, &group);
    group.iGroupId = 11;//hidden
    group.mask = LVGF_GROUPID | LVGF_STATE;
    group.stateMask = LVGS_HIDDEN;
    group.state = LVGS_HIDDEN;
    ListView_InsertGroup(ListView, -1, &group);
Run Code Online (Sandbox Code Playgroud)

现在我已经向两个组添加了一些项目,唯一的问题是我可以看到它们(它们是分开的),而另一个应该是隐藏的.

Rem*_*eau 6

用于LVM_SETITEM通过LVITEM::iGroupId成员将列表项分配给特定组:

LVITEMW lisW = { 0 };
lisW.mask = ... | LVIF_GROUPID;
...
lisW.iItem = ...;
lisW.iGroupId = ...;
SendMessage(ListView, 0, (LPARAM)&lisW);
Run Code Online (Sandbox Code Playgroud)

您可以通过将其成员设置为:LVM_INSERTGROUP来插入隐藏组,或用于LVM_SETGROUPINFO隐藏现有组:LVGROUP::stateLVGS_HIDDEN

LVGROUP grp = { 0 };
grp.cbSize = sizeof(grp);
grp.mask = LVGF_STATE;
grp.iGroupId = ...;
grp.stateMask = LVGS_HIDDEN | LVGS_NOHEADER | LVGS_COLLAPSED;
grp.state = LVGS_HIDDEN | LVGS_NOHEADER | LVGS_COLLAPSED;

SendMessage(ListView, LVM_INSERTGROUP, -1, (LPARAM)&grp);
or:
SendMessage(ListView, LVM_SETGROUPINFO, grp.iGroupId, (LPARAM)&grp);
Run Code Online (Sandbox Code Playgroud)

确保您LVM_ENABLEGROUPVIEW事先已启用群组:

SendMessage(ListView, LVM_ENABLEGROUPVIEW, TRUE, 0);
Run Code Online (Sandbox Code Playgroud)

话虽这么说,当您在ListView中显示/搜索/过滤大量项目时,通常最好在虚拟模式下使用ListView .您可以根据需要预先过滤数据,然后使用它LVM_SETITEMCOUNT来指定要显示的项目数,然后LVN_GETDISPINFO在ListView向您请求时检索特定项目的数据.这样,您可以直接在数据源中(在内存中,在数据库中等)进行所有搜索/过滤,然后LVM_REDRAWITEMS在显示新数据时,使用需要在屏幕上刷新的ListView部分无效.当您有要添加/删除的项目时,您只需重新发送LVM_SETITEMCOUNT.这是处理大量列表项的更快更灵活的方法.

使用虚拟列表