CTreeCtrl 展开而不滚动

Posted

技术标签:

【中文标题】CTreeCtrl 展开而不滚动【英文标题】:CTreeCtrl Expand without scrolling 【发布时间】:2012-07-13 22:43:08 【问题描述】:

在我的 CTreeCtrl 中,当我展开一个不可见的节点时,控件会自动重新定位树以使展开的节点可见。有什么办法可以防止这种行为?

用例:我有一棵树,它正在从远程源异步加载项目,并且可能会在很长一段时间内构建树的“底部”,目前在完成时跳转到每个节点的树行为是非常分散用户的注意力。

当前解决方法:

/******************************************************************************
 Expand an item while retaining the tree position
 ******************************************************************************/
void CFileOpenTreeView::ExpandWithoutJumping(HTREEITEM hItem)

    // This still flickers for some reason, but at least it doesn't jump
    LockWindowUpdate();
    HTREEITEM hFirstVisible = GetTreeCtrl().GetFirstVisibleItem();

    GetTreeCtrl().Expand(hItem, TVE_EXPAND);

    GetTreeCtrl().SelectSetFirstVisible(hFirstVisible);
    UnlockWindowUpdate();
    Invalidate();

【问题讨论】:

【参考方案1】:

要回答您的直接问题,您可以在填充控件时关闭窗口刷新,使用 CWnd::LockWindowUpdate()CWnd::UnlockWindowUpdate()

不过,总的来说,如果可以的话,您可能需要重新考虑您的策略。例如,您可以在不展开父节点的情况下填充树中的子节点。

此外,在您描述的用例中,您可能希望仅在用户展开父节点时才动态填充节点的子节点。

【讨论】:

我当前的解决方法锁定了窗口,但由于某种原因它仍然闪烁,我希望有一些不那么“hackish”的方式。在这种情况下,我需要扩展节点,因为用户希望树返回到之前的状态。当父级展开时,这个特定的树也会加载节点,fwiw。无论如何谢谢:>

以上是关于CTreeCtrl 展开而不滚动的主要内容,如果未能解决你的问题,请参考以下文章

调用 SelectItem 函数时如何强制 CTreeCtrl 不滚动到项目?

MFC控件:树形控件(CTreeCtrl)

暂停渲染/绘图 CTreeCtrl (MFC)

CTreeCtrl - 获取项目位置

为啥我的 CTreeCtrl 复选框不检查?

如何在 MFC 中处理 CTreeCtrl 的状态更改事件