我的应用程序使用 ctreectrl
显示保存在内存中的大量文件系统条目,即使使用 SetRedraw(False)
添加所有项目也需要大约 20 秒,那么如何制作一个完全虚拟的(广度,深度)ctreectrl
以及如何填充它?
编辑#1 我想显示从头开始展开的显示部分项目,但我不想将它们存储在树中,例如
Root-->
Child1-->
SubChile1
Child2
Child3
最佳答案
您不能一次添加所有项目。您必须使用 cChildren = I_CHILDRENCALLBACK
仅添加顶级项目
和处理WM_NOTIFY
- 与
code == TVN_GETDISPINFO
如果mask & TVIF_CHILDREN
放cChildren
(正确或错误) - 与
code == TVN_ITEMEXPANDING
,action == TVE_EXPAND
- 扩张 节点 - 再次仅添加直接子项(一级)cChildren = I_CHILDRENCALLBACK
有可能
- 与
code == TVN_ITEMEXPANDED
,action == TVE_COLLAPSE
- 坍塌 节点 - 删除所有 child
感cChildren = I_CHILDRENCALLBACK
- 如果您将文件夹添加到列表中,您不需要立即初始化它(打开句柄,枚举子项) - 只有当您第一次得到 I_CHILDRENCALLBACK
时(这是当您的项目变得可见时,但如果包含足够大的文件夹(如 system32) - 它有太多项目,但在开始时只有几个顶部可见,当用户向下滚动时新开始可见) - 打开文件夹,确定它是否有子项(并且基于此集合 cChildren
)但没有完全枚举它(仅在 <TVN_ITEMEXPANDING, TVE_EXPAND>
上执行此操作
关于c++ - MFC如何让ctreectrl虚化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43907524/