5

我有一个SysListView32应该可以容纳数百万行,以及三列文本 A、B、C,每列 < 256 个字符。

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

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

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

如何修改它以使其工作?

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

1 回答 1

0

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

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

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

链接:

虚拟列表控件

使用虚拟列表

于 2017-07-04T07:39:47.007 回答