我有一个CTreeCtrl
对象(C ++,MFC)。此CTreeCtrl
会记住上次选择,如果用户再次打开窗口,则最后一个选项将展开并自动选择。但是当我调用EnsureVisible
来显示最后一个选项时,它会出现在TreeCtrl的底部。我尝试了很多(例如这个How to make a CTreeCtrl item centrally displayed?),但它对我的TreeControl没有影响。
有没有人知道在TreeControl中间(以编程方式)展开和显示项目的好方法?一个例子就是很棒!
答案 0 :(得分:4)
调用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);
结尾,以避免重新粉饰。