[英]MFC How to make ctreectrl virtual?
我的應用程序使用ctreectrl
顯示在內存中保存的大量文件系統條目,即使使用SetRedraw(False)
,所有項目也需要~20 SetRedraw(False)
,因此如何制作完全虛擬(廣度,深度)的ctreectrl
以及如何填充它?
編輯#1我想顯示從頭開始展開的顯示部分項目,但我不想將它們存儲在樹中,例如
Root-->
Child1-->
SubChile1
Child2
Child3
您不能一次添加所有項目。 你必須只用cChildren = I_CHILDRENCALLBACK
添加頂級項目並處理WM_NOTIFY
code == TVN_GETDISPINFO
如果mask & TVIF_CHILDREN
設置cChildren
(TRUE或FALSE) code == TVN_ITEMEXPANDING
, action == TVE_EXPAND
- 展開節點 - 使用cChildren = I_CHILDRENCALLBACK
再次添加直接子項(一個級別) 並且可能
code == TVN_ITEMEXPANDED
, action == TVE_COLLAPSE
- 折疊節點 - 刪除所有子節點 感覺cChildren = I_CHILDRENCALLBACK
- 如果你將文件夾添加到列表中,你不需要立即初始化它(打開句柄,枚舉孩子) - 只有當你第一次得到I_CHILDRENCALLBACK
(這當你的項目變得可見時,但是如果包含足夠大的文件夾(像system32 ) - 它有太多的項目,但在開始時只能看到幾個頂部,當用戶向下滾動時新的開始可見) - 打開文件夾,確定它是否有子項(並且基於此設置cChildren
)但不完全枚舉它(做這僅限於<TVN_ITEMEXPANDING, TVE_EXPAND>
我沒有建議讓它虛擬化。 我用於大型樹結構,只有在需要時才可以收集子分支。 我陷阱TVN_ITEMEXPANDING
那么怎么做:首先讀取第一級(root),然后保持所有根節點折疊並讀取根的所有子節點(只有1級深度)並填充它們。
當節點擴展時,您已經擁有節點,現在讀取擴展節點的子節點下面的下一級別。
所以你只看到擴展節點加上一個不可見的級別。
我這樣做是為了顯示所有可用+符號擴展的節點。 沒有子節點的所有節點都顯示為沒有葉子。
第二種方法是不填充字符串數據,讓樹通過回調加載它。 但影響很小。 速度的真正問題是節點數量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.