我的应用程序使用ctreectrl
显示内存中保存的大量文件系统条目,即使使用SetRedraw(False)
,所有项目也需要大约20秒,因此如何完全虚拟化(广度) ,深度)ctreectrl
&如何填充它?
编辑#1 我想显示从头开始展开的显示部分项目,但我不想将它们存储在树中,例如
Root-->
Child1-->
SubChile1
Child2
Child3
答案 0 :(得分:3)
您不能一次添加所有项目。您必须仅使用cChildren = I_CHILDRENCALLBACK
添加顶级项
并处理WM_NOTIFY
code == TVN_GETDISPINFO
设置,则mask & TVIF_CHILDREN
cChildren
(正确或错误)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>
答案 1 :(得分:2)
我没有建议让它成为虚拟的。 我用于大型树结构,只有在需要时才可以收集子分支。我陷阱TVN_ITEMEXPANDING
那么怎么做:首先读取第一级(root),然后保持所有根节点折叠并读取根的所有子节点(只有1级深度)并填充它们。
当节点扩展时,您已经拥有节点,现在读取扩展节点的子节点下面的下一级别。
因此,您只能看到展开的节点加上一个不可见的级别。
我这样做是为了显示所有可以使用+号扩展的节点。没有子节点的所有节点都显示为没有叶子。
第二种方法是不填充字符串数据,让树通过回调加载它。但影响很小。速度的真正问题是节点数量。