Windows 100万行列表视图

Windows 100万行列表视图,windows,listview,user-interface,winapi,syslistview32,Windows,Listview,User Interface,Winapi,Syslistview32,我有一个SysListView32,它可能包含数百万行,还有三列文本a、B、C,每个都

我有一个
SysListView32
,它可能包含数百万行,还有三列文本a、B、C,每个都<256个字符

假设B列有许多重复(例如:A列是文件名,B列是路径,每行是文件系统的一个文件),并且只有100k个不同的值(而不是几百万个)

是否可以避免在RAM中重复
ListView
GUI元素的B列内容?

我们是否可以仅使用指向数组元素的指针(取自B列不同值的100k元素数组)而不是重复数据来填充
ListView

如何对此进行修改以使其正常工作

LV_ITEM item;
item.mask = LVIF_TEXT;
item.pszText = "Hello";
...
ListView_SetItem(hList, &item);

您需要的也被称为“虚拟列表”。虚拟列表控件是具有
LVS\u OWNERDATA
样式的列表视图控件。此样式使控件支持最多为DWORD的项计数(默认项计数仅扩展到int)。但是,这种样式提供的最大优点是,在任何时候都只能在内存中包含数据项的子集。这使得虚拟列表视图控件可以与大型信息数据库配合使用,因为在这些数据库中,已经有了访问数据的特定方法。对于给定的数据集(列表或动态数组),需要执行以下步骤:

  • 将LVS_OWNERDATA样式添加到ListView
  • 调用CListCtrl::SetItemCount传递数据源大小,如std::vector::size()
  • 捕获LVN_GETDISPINFO通知。这是将数据呈现到ListCtrl中的位置
  • 请查看我添加的附加链接,了解更多信息和示例代码。如果使用CListView,则可以使用访问CListCtrl

    链接:


    和@IInspectable看起来确实很有趣,我读了几遍,但我可能还需要10次阅读才能完全理解它。也许你认为我们可以找到一个完整的MSVC++玩具项目来演示这一点,用一个真正具体的列表视图来填充行?其实没什么。使用
    LVS\u OWNERDATA
    样式创建列表视图,在
    LVITEM.lParam
    中存储指向原始数据的指针,并处理
    LVN\u GETDISPINFO
    消息。我经常这样做。现在您知道要研究什么了,您就可以轻松地解决这个问题了。@IInspectable
    在LVITEM.lParam中存储一个指向原始数据的指针这是虚拟列表的错误。它不为项目分配数据,也不存储任何LPRAM。需要使用
    NMLVDISPINFO.item.iItem
    谢谢@RonTLV。你能添加一些代码作为如何做的示例吗?@Basj+sources+demoproject@Basj这个代码示例似乎没有显示问题的棘手部分,即虚拟列表方面。没有LVS_OWNERDATA或LVN_GETDISPINFO。这才是真正的问题:如何处理虚拟列表。