如何将CTreeCtrl项目滚动到中心

How to scroll CTreeCtrl item to center

本文关键字:滚动 项目 CTreeCtrl      更新时间:2023-10-16

我有一个CTreeCtrl对象(C++,MFC)。此CTreeCtrl会记住上次选择,如果用户再次打开窗口,则会自动展开并选择上次选择。但是,当我调用EnsureVisible来显示最后一个选择时,它会出现在TreeCtrl的底部。我尝试了很多(例如如何使CTreeCtrl项集中显示?)但它对我的TreeControl没有影响。

有人知道在TreeControl中间展开和显示项的好方法吗(以编程方式)?举个例子就太好了!

调用EnsureVisible后,向下滚动一页(这将把目标项向上推到视图之外),然后再次调用EnsureVisible。这保证了目标项目是顶部的第一个可见项目(除非没有足够的项目并且无法滚动)

然后向上滚动,将项目向下推,直到项目位于在中间。

tree.EnsureVisible(htreeitem_target);
tree.SendMessage(WM_VSCROLL, SB_PAGEDOWN, 0);
tree.EnsureVisible(htreeitem_target);//item is on top now
CRect rc;
tree.GetClientRect(&rc);
for (int i = 0; i < tree.GetVisibleCount(); i++)
{
    CRect r;
    tree.GetItemRect(htreeitem_target, &r, FALSE);
    if (r.bottom > rc.Height() / 2)
        break;
    tree.SendMessage(WM_VSCROLL, SB_LINEUP, 0);
}

也可以从tree.SetRedraw(FASLE);开始,以tree.SetRedraw(TRUE);结束,以避免重新绘制。