我的应用程序正在使用 a 显示在内存中保存的大量文件系统条目ctreectrl
,即使在使用时添加所有项目也需要约 20 秒SetRedraw(False)
,那么如何制作一个完全虚拟的(宽度、深度)ctreectrl
以及如何填充它?
Edit#1 我想显示从开头展开的显示部分项目,但我不想将它们存储在树中,例如
Root-->
Child1-->
SubChile1
Child2
Child3
我的应用程序正在使用 a 显示在内存中保存的大量文件系统条目ctreectrl
,即使在使用时添加所有项目也需要约 20 秒SetRedraw(False)
,那么如何制作一个完全虚拟的(宽度、深度)ctreectrl
以及如何填充它?
Edit#1 我想显示从开头展开的显示部分项目,但我不想将它们存储在树中,例如
Root-->
Child1-->
SubChile1
Child2
Child3
您不能一次添加所有项目。您必须只添加顶级项目cChildren = I_CHILDRENCALLBACK
和处理WM_NOTIFY
code == TVN_GETDISPINFO
如果设置mask & TVIF_CHILDREN
(
cChildren
真或假)code == TVN_ITEMEXPANDING
, action == TVE_EXPAND
- expand node - 再次只添加直接子项(一级)
cChildren = I_CHILDRENCALLBACK
并且可能
code == TVN_ITEMEXPANDED
, action == TVE_COLLAPSE
- 折叠节点 - 删除所有子节点感觉cChildren = I_CHILDRENCALLBACK
-如果您将文件夹添加到列表中,则不需要立即初始化它(打开句柄,枚举子级)-仅在您第一次获得I_CHILDRENCALLBACK
时(当您的项目变得可见时,但如果包含足够大的文件夹(如system32)-它有太多的项目,但在开始时只有几个顶部可见,当用户向下滚动时新的开始可见)-打开文件夹,确定它是否有子项目(并基于此集合cChildren
)但没有完全枚举它(仅在<TVN_ITEMEXPANDING, TVE_EXPAND>
我没有建议让它虚拟化。我将仅在需要时收集子分支的可能性用于大型树结构。我陷阱TVN_ITEMEXPANDING
那么怎么做:首先读取第一级(根),而不是保持所有根节点折叠并读取根的所有子节点(仅1级深)并填充它们。
当一个节点展开时,您已经有了这些节点,现在读取展开节点的子节点下方的下一层。
所以你只看到扩展的节点加上一个不可见的级别。
我这样做是为了显示所有可使用 + 号展开的节点。所有没有子节点的节点都显示为叶子。
第二种方法是不填充字符串数据,让树通过回调加载它。但影响很小。速度的真正问题是节点的数量。