3

我的应用程序正在使用 a 显示在内存中保存的大量文件系统条目ctreectrl,即使在使用时添加所有项目也需要约 20 秒SetRedraw(False),那么如何制作一个完全虚拟的(宽度、深度)ctreectrl以及如何填充它?

Edit#1 我想显示从开头展开的显示部分项目,但我不想将它们存储在树中,例如

Root-->
    Child1-->
        SubChile1
    Child2
    Child3
4

2 回答 2

3

您不能一次添加所有项目。您必须只添加顶级项目cChildren = I_CHILDRENCALLBACK 和处理WM_NOTIFY

  • code == TVN_GETDISPINFO如果设置mask & TVIF_CHILDRENcChildren真或假)
  • with code == TVN_ITEMEXPANDING, action == TVE_EXPAND- expand node - 再次只添加直接子项(一级) cChildren = I_CHILDRENCALLBACK

并且可能

  • with code == TVN_ITEMEXPANDED, action == TVE_COLLAPSE- 折叠节点 - 删除所有子节点

感觉cChildren = I_CHILDRENCALLBACK-如果您将文件夹添加到列表中,则不需要立即初始化它(打开句柄,枚举子级)-仅在您第一次获得I_CHILDRENCALLBACK时(当您的项目变得可见时,但如果包含足够大的文件夹(如system32)-它有太多的项目,但在开始时只有几个顶部可见,当用户向下滚动时新的开始可见)-打开文件夹,确定它是否有子项目(并基于此集合cChildren)但没有完全枚举它(仅在<TVN_ITEMEXPANDING, TVE_EXPAND>

于 2017-05-11T06:17:30.570 回答
2

我没有建议让它虚拟化。我将仅在需要时收集子分支的可能性用于大型树结构。我陷阱TVN_ITEMEXPANDING

那么怎么做:首先读取第一级(根),而不是保持所有根节点折叠并读取根的所有子节点(仅1级深)并填充它们。

当一个节点展开时,您已经有了这些节点,现在读取展开节点的子节点下方的下一层。

所以你只看到扩展的节点加上一个不可见的级别。

我这样做是为了显示所有可使用 + 号展开的节点。所有没有子节点的节点都显示为叶子。

第二种方法是不填充字符串数据,让树通过回调加载它。但影响很小。速度的真正问题是节点的数量。

于 2017-05-11T06:08:28.307 回答