Mfc CListCtrl:如何保持滚动位置?

Mfc CListCtrl:如何保持滚动位置?,mfc,scroll,clistctrl,Mfc,Scroll,Clistctrl,我有一个CListCtrl(报告样式),在这里我清除列表并在特定时间重新填充它。执行此操作时,我希望保持垂直滚动位置。我发现有两种方法看起来很有希望: EnsureVisible() GetScrollPos() SetScrollPos() GetScrollInfo() GetTopIndex() Scroll() 我正在尝试GetScrollPos()和SetScrollPos(),但它似乎不起作用。保存滚动位置然后在以后恢复的简单正确方法是什么 更新 实际上,我似乎可以保存滚动位置Ge

我有一个CListCtrl(报告样式),在这里我清除列表并在特定时间重新填充它。执行此操作时,我希望保持垂直滚动位置。我发现有两种方法看起来很有希望:

EnsureVisible()
GetScrollPos()
SetScrollPos()
GetScrollInfo()
GetTopIndex()
Scroll()
我正在尝试GetScrollPos()和SetScrollPos(),但它似乎不起作用。保存滚动位置然后在以后恢复的简单正确方法是什么

更新

实际上,我似乎可以保存滚动位置GetScrollPos(),然后设置ScrollPos()来恢复它,但是它实际上似乎只是设置滚动条的位置,并没有实际滚动CListCtrl的项目

更新2


Scroll()方法似乎可以正确地滚动滚动条和内容。但是,它将CSize对象作为其参数。所以问题是如何在CSize和GetTopIndex或GetScrollInfo/Pos的输出之间进行转换。

我过去已经这样做了。IIRC,诀窍在于:

int topIndex= m_List.GetTopIndex();
RenewContents();
m_List.EnsureVisible(m_List.GetItemCount() - 1); // Scroll down to the bottom
m_List.EnsureVisible(topIndex);// scroll back up just enough to show said item on top

另一种方法是:

CRect r;
m_lcList.GetItemRect(0, r, LVIR_BOUNDS);
int scrollPos = m_lcList.GetTopIndex() * r.Height();
RenewContents();
m_lcList.Scroll(CSize(0, scrollPos));

太好了,这很管用。我更喜欢使用Scroll()的解决方案,但这就可以了。你知道如果你更新列表内容后,你的项目比nTopIndex少会发生什么吗?我想EnsureRevible(nTopIndex)不会有任何效果。您将看到一个向下滚动到底部的列表。为什么M$不提供SetTopIndex方法呢-(