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 展开而不滚动的主要内容,如果未能解决你的问题,请参考以下文章