0

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

1 回答 1

1

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

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

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

于 2012-07-13T22:52:23.037 回答