CTreeCtrl展开而不滚动

时间:2012-07-13 22:43:09

标签: mfc

在我的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 个答案:

答案 0 :(得分:1)

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

一般而言,如果可以,您可能想重新考虑您的策略。例如,您可以在不扩展父节点的情况下填充树中的子节点。

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