簡體   English   中英

MFC如何讓ctreectrl虛擬?

[英]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_ITEMEXPANDINGaction == TVE_EXPAND - 展開節點 - 使用cChildren = I_CHILDRENCALLBACK再次添加直接子項(一個級別)

並且可能

  • 使用code == TVN_ITEMEXPANDEDaction == 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM