winapi - CListCtrl:如何保持水平滚动位置?

标签 winapi mfc scroll clistctrl

如何保持CListCtrl的水平滚动条位置?我会定期转储并重新填充列表控件的内容,因此无需显式记住旧位置并将其恢复,滚动只返回到左上角。

我早些时候问了一个相关的问题CListCtrl: How to maintain scroll position?,但是当时我只对垂直滚动位置感兴趣,提供的答案解决了这个问题。但是,现在我想记住并恢复水平滚动位置(以及垂直滚动)。

最佳答案

首先,您可能会觉得更简单。重新填充列表之前和重新填充强制列表控件之后,必须保存位置以更新新内容。

另外,您可能会考虑新内容可能具有不同数量的项目的事实,因此您必须相对于最大滚动位置设置位置。

示例代码如下:

    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”。

关于winapi - CListCtrl:如何保持水平滚动位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10941173/

相关文章:

c++ - 围绕着 windows.h - const char* vs LPSTR

c# - 如何以编程方式读取 .pdf 文件并将其转换为音频(.mp3 格式)?

Windows 资源管理器备用数据流外壳扩展

c++ - 为什么 GetServiceDisplayNameW() 和 GetServiceDisplayNameA() 在字符中返回不同的所需缓冲区大小?

windows - Win32/MFC 应用程序开发选项

Javascript:滚动到表格中的第 n 行?

iphone - 如何使用Cocos2D制作没有瓦片 map 的滚动游戏?

JavaFX setOnScrollStarted 和 setOnScrollFinished 不起作用

c++ - 将 OLECHAR* 转换为 CHAR* 以构建 string()

C++ MFC : Separating common controls into a group