如何保持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/