CListCtrl的:如何保持水平滚动位置?(CListCtrl: How to maintain

2019-09-17 21:48发布

我怎样才能保持一个CListCtrl的水平滚动条的位置? 我周期性地更新和重新填充列表控件的内容,因此没有明确想起老位置,并恢复它的滚动刚回到左上角。

我问一个相关的问题, CListCtrl的:如何保持滚动位置? 较早但当时我只是在垂直滚动位置感兴趣,并提供答案解决了。 不过,现在我要记住,并恢复了水平滚动位置(以及垂直滚动)。

Answer 1:

首先,它是你可能会觉得简单。 你必须重新填充列表之前和重新建力列表控件更新新的内容后保存位置。

此外,你可以好好考虑下一个事实,即新的内容可以有不同数量的项目,因此你将不得不相对于最大滚动位置的位置设置。

示例代码如下:

    SCROLLINFO sbiBefore = { sizeof(SCROLLINFO) };
    SCROLLINFO sbiAfter = { sizeof(SCROLLINFO) };

    // get scroll info before
    sbiBefore.fMask = SIF_ALL;
    m_List.GetScrollInfo(SB_HORZ, &sbiBefore);

    RenewContents();

    // force control to redraw
    int iCount = m_List.GetItemCount();
    m_List.RedrawItems(0, iCount);

    // get the scroll info after
    sbiAfter.fMask = SIF_ALL;
    m_List.GetScrollInfo(SB_HORZ, &sbiAfter);

    double dRatio = (double)sbiAfter.nMax / sbiBefore.nMax;

    // compute relative new position
    sbiAfter.fMask = SIF_POS;
    sbiAfter.nPos = dRatio * sbiBefore.nPos;

    // set new position
    BOOL bSet = m_List.SetScrollInfo(SB_HORZ, &sbiAfter);

我相信,你可以以同样的方式处理垂直滚动。 在你提到的帖子,EnsureVisible用来强制更新不必要的,因为你有这样做的更合适的方式。 另外,如果最后一个项目是可见的已使用EnsureVisible是行不通的。



文章来源: CListCtrl: How to maintain horizontal scroll position?