MFC 如何使 ctreectrl 虚拟

MFC How to make ctreectrl virtual?

本文关键字:虚拟 ctreectrl 何使 MFC      更新时间:2023-10-16

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

编辑#1我想显示从一开始就展开的显示部分项目,但我不想将它们存储在树中,例如

Root-->
    Child1-->
        SubChile1
    Child2
    Child3

不能一次添加所有项目。 必须仅添加具有cChildren = I_CHILDRENCALLBACK的顶级项并处理WM_NOTIFY

  • 如果设置了mask & TVIF_CHILDREN则带有code == TVN_GETDISPINFO cChildren(真或假(
  • 使用 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

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

当一个节点展开时,你已经有了节点,现在读取扩展节点子节点下面的下一级。

因此,您只能看到扩展的节点和一个不可见的级别。

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

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