如何将 CTreeCtrl 项目滚动到中心
How to scroll CTreeCtrl item to center
我有一个 CTreeCtrl
对象(C++、MFC)。此 CTreeCtrl
会记住最后一个 selection,如果用户再次打开 window,最后一个 selection 将自动展开并 select。但是当我调用 EnsureVisible
来显示最后一个 selection 时,它出现在 TreeCtrl 的底部。我尝试了很多(例如这个 How to make a CTreeCtrl item centrally displayed?),但它对我的 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);
结尾以避免重绘。
我有一个 CTreeCtrl
对象(C++、MFC)。此 CTreeCtrl
会记住最后一个 selection,如果用户再次打开 window,最后一个 selection 将自动展开并 select。但是当我调用 EnsureVisible
来显示最后一个 selection 时,它出现在 TreeCtrl 的底部。我尝试了很多(例如这个 How to make a CTreeCtrl item centrally displayed?),但它对我的 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);
结尾以避免重绘。