Прежде всего, это проще, чем вы думаете. Вы должны сохранить позицию перед повторным заполнением списка и после повторного заполнения списка элементов управления для обновления нового контента.
Кроме того, вы можете принять во внимание тот факт, что новый контент может иметь различное количество элементов, поэтому вам нужно будет установить положение относительно положения макс. Прокрутки.
Пример кода следующим образом:
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 не будет работать, если последний элемент уже виден.
Этот код не работает правильно для меня, когда применяется к вертикальной полосе прокрутки. Он переместил большой палец прокрутки, но содержимое элемента управления списком оставалось прокручиваемым вверх, и как только я щелкнул стрелку вверх/вниз по стрелкам, палец прокрутки перевернулся вверх. – StilesCrisis