MFC如何让ctreectrl虚拟?

时间:2017-05-11 05:53:16

标签: c++ winapi mfc treeview treecontrol

我的应用程序使用ctreectrl显示内存中保存的大量文件系统条目,即使使用SetRedraw(False),所有项目也需要大约20秒,因此如何完全虚拟化(广度) ,深度)ctreectrl&如何填充它?

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

Root-->
    Child1-->
        SubChile1
    Child2
    Child3

2 个答案:

答案 0 :(得分:3)

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

    如果code == TVN_GETDISPINFO设置,则
  • mask & TVIF_CHILDREN 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>

上执行此操作

答案 1 :(得分:2)

我没有建议让它成为虚拟的。 我用于大型树结构,只有在需要时才可以收集子分支。我陷阱TVN_ITEMEXPANDING

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

当节点扩展时,您已经拥有节点,现在读取扩展节点的子节点下面的下一级别。

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

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

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