【问题标题】:How to scroll CTreeCtrl item to center如何将 CTreeCtrl 项目滚动到中心
【发布时间】:2016-01-28 10:24:54
【问题描述】:

我有一个CTreeCtrl 对象(C++、MFC)。这个CTreeCtrl 会记住最后一次选择,如果用户再次打开窗口,最后一次选择将自动展开并选择。但是当我调用EnsureVisible 来显示最后一个选择时,它会出现在TreeCtrl 的底部。我尝试了很多(例如 How to make a CTreeCtrl item centrally displayed?),但它对我的 TreeControl 没有影响。

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

【问题讨论】:

    标签: c++ mfc scrollbar


    【解决方案1】:

    在调用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); 结尾以避免重绘。

    【讨论】:

    • 请注意,在调用 EnsureVisible() 期间,SetRedraw() 需要为真。之后您可以禁用它以避免在 for() 循环期间重绘。感谢巴尔马克的精彩帖子!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2013-10-26
    相关资源
    最近更新 更多