Mfc CTREECRL展开而不滚动

Mfc CTREECRL展开而不滚动,mfc,Mfc,在CTreeCtrl中,当我展开不可见的节点时,控件会自动重新定位树以使展开的节点可见。有没有办法防止这种行为 用例:我有一棵树,它从远程源异步加载项目,并且可能在相当长的一段时间内构建树的“底部”,目前,完成后跳到每个节点的树行为会让用户分心 当前解决方法: /****************************************************************************** Expand an item while retaining the tre

在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();
}

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

不过,总的来说,如果可以的话,你可能需要重新考虑你的战略。例如,可以在树中填充子节点,而无需展开父节点


另外,在您描述的用例中,您可能希望只在用户扩展父节点时动态填充节点的子节点。

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