我有一个CListCtrl(报告样式),我清除列表并在特定时间重新填充它。这样做时我想保持垂直滚动位置。我看到有几种方法看起来很有希望:
EnsureVisible()
GetScrollPos()
SetScrollPos()
GetScrollInfo()
GetTopIndex()
Scroll()
我正在尝试GetScrollPos()然后尝试SetScrollPos()但它似乎没有工作。保存滚动位置然后将其恢复的简单正确方法是什么?
更新
实际上我似乎可以保存滚动位置GetScrollPos()然后再保存SetScrollPos()来恢复它,但它实际上似乎只是设置了滚动条位置而实际上并没有滚动我的CListCtrl项。
更新2
Scroll()方法似乎正确滚动滚动条和内容。然而,它需要一个CSize对象作为它的参数。所以问题是如何在CSize和GetTopIndex或GetScrollInfo / Pos的输出之间进行转换。
答案 0 :(得分:17)
我过去做过。 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
答案 1 :(得分:0)
另一种方式是这样的:
CRect r;
m_lcList.GetItemRect(0, r, LVIR_BOUNDS);
int scrollPos = m_lcList.GetTopIndex() * r.Height();
RenewContents();
m_lcList.Scroll(CSize(0, scrollPos));