100万行ListView

Bas*_*asj 5 windows user-interface winapi listview syslistview32

我有一个SysListView32应该托管数百万行,三列文本A,B,C每个<256个字符.

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

是否可以避免ListViewGUI元素B列内容的RAM重复?

我们可以ListView只填充指向数组元素的指针(取自列B的不同值的100k元素数组),而不是重复数据吗?

如何修改它以使其工作?

LV_ITEM item;
item.mask = LVIF_TEXT;
item.pszText = "Hello";
...
ListView_SetItem(hList, &item);
Run Code Online (Sandbox Code Playgroud)

Ron*_*TLV 0

您需要的也称为“虚拟列表”。虚拟列表控件是具有样式的列表视图控件LVS_OWNERDATA。此样式使控件能够支持高达 DWORD 的项目计数(默认项目计数仅扩展到 int)。然而,这种风格提供的最大优点是能够在任何时候内存中仅存在数据项的子集。这允许虚拟列表视图控件适合与大型信息数据库一起使用,其中已经存在访问数据的特定方法。对于给定的一组数据(列表或动态数组),您需要执行以下步骤:

  1. 将 LVS_OWNERDATA 样式添加到您的 ListView
  2. 调用 CListCtrl::SetItemCount 并传递数据源大小,如 std::vector::size()。
  3. 捕获 LVN_GETDISPINFO 通知。这是数据呈现到 ListCtrl 中的地方。

请查看我添加的附加链接,以获取更多信息和示例代码。如果您使用 CListView 您可以使用GetListCtrl访问 CListCtrl 。

链接:

虚拟列表控件

使用虚拟列表