[英]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_ITEMEXPANDING
, action == TVE_EXPAND
- 展开节点 - 使用cChildren = I_CHILDRENCALLBACK
再次添加直接子项(一个级别) 并且可能
code == TVN_ITEMEXPANDED
, action == 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.