繁体   English   中英

MFC如何让ctreectrl虚拟?

[英]MFC How to make ctreectrl virtual?

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

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

Root-->
    Child1-->
        SubChile1
    Child2
    Child3

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

  • 使用code == TVN_GETDISPINFO如果mask & TVIF_CHILDREN设置cChildren (TRUE或FALSE)
  • 使用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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM