2017-06-27 135 views
5

我有一個SysListView32應該有可能主持數百萬行,並且三列文本A,B,C每個< 256個字符。假設列B有許多重複(例如:列A是文件名,列B是路徑,每行是文件系統的文件),並且只有100k個不同的值(而不是幾百萬)。1百萬行ListView

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

我們能填充ListView指針到數組中的元素(從塔B的不同值的100K的元件陣列剖切),而不是複製數據?

如何修改它使其工作?

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

[虛擬列表視圖樣式](https://msdn.microsoft.com/en-us/library/windows/desktop/bb774735.aspx #Virtual_ListView_Style)和[如何使用虛擬列表視圖控件](https://msdn.microsoft.com/en-us/library/windows/desktop/hh270411.aspx)。 – IInspectable

+0

@IInspectable確實看起來很有趣,我讀了幾次,但我可能需要更多的讀數才能完全掌握它。也許你認爲我們可以找到一個完整的MSVC++玩具項目來證明這一點,一個真正的具體ListView填充行? – Basj

+1

真的沒有多少。您可以使用'LVS_OWNERDATA'風格創建列表視圖,在'LVITEM.lParam'中存儲一個指向原始數據的指針,並處理'LVN_GETDISPINFO'消息。 – IInspectable

回答

0

你需要什麼也稱爲「虛擬列表」。虛擬列表控件是具有LVS_OWNERDATA樣式的列表視圖控件。此樣式使控件支持最多DWORD的項目數(默認項目計數僅擴展到int)。但是,這種風格所提供的最大優勢是在任何時候只能在內存中擁有一部分數據項。這允許虛擬列表視圖控件適用於大型數據庫信息,其中訪問數據的特定方法已經就位。對於給定的數據(表或動態數組),您需要按照下列步驟操作:

  1. 添加LVS_OWNERDATA風格到您的ListView
  2. 撥打電話到的CListCtrl :: SetItemCount傳遞數據源的大小,如的std ::矢量::尺寸()。
  3. 捕獲LVN_GETDISPINFO通知。這是將數據呈現到ListCtrl中的位置。

請查看我添加的附加鏈接,以獲取更多信息和示例代碼。如果您使用CListView,則可以使用GetListCtrl訪問CListCtrl。

鏈接:

Virtual List Controls

Using virtual lists

+0

Thanks @RonTLV。你可以添加一些代碼作爲如何做到這一點的例子嗎? – Basj

+0

@Basj [在Win32 API下使用ListView控件](https://www.codeproject.com/Articles/2890/Using-ListView-control-under-Win-API)+ sources +演示項目 – RonTLV

+0

@Basj [關於List-查看控件](https://msdn.microsoft.com/en-us/library/windows/desktop/bb774735(v = vs.85).aspx)和[使用列表視圖控件](https:// msdn。 microsoft.com/en-us/library/windows/desktop/bb774736(v=vs.85).aspx) – RonTLV