c++ - 如何将 CTreeCtrl 项目滚动到中心

标签 c++ mfc scrollbar

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

有谁知道在 TreeControl 中间展开和显示项目的好方法(以编程方式)?一个例子会很棒!

最佳答案

调用 EnsureVisible 后,向下滚动一页(这会将目标项目向上推到 View 之外),然后再次调用 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); 结束以避免重绘。

关于c++ - 如何将 CTreeCtrl 项目滚动到中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33394566/

相关文章:

c++ - STL栈和双端队列之间的转换

c++ - 从多字节字符集转换旧的 Visual Studio C++ 项目

c++ - 如何正确添加字符串到QListWidgets?

c++ - 循环检查或编辑框

c++ - 在 MFC 中,如何避免对话框停留在我的应用程序窗口的顶部?

css - 在 Windows Phone 上的元素内滚动时如何使滚动条出现?

javascript - 将多选引导下拉选项放在 div 之外(防止滚动冒泡)

java - 如何使用 WebDriver 验证 WebElement 是否显示在视口(viewport)中?

c++ - "for(;;)"的用途是什么

带非托管 C++ Unicode DLL 链接到非托管 C++ ANSI DLL 的 C# EXE 崩溃