우선, 생각하는 것이 더 간단합니다. 목록을 다시 채우고 강제로 목록 컨트롤을 다시 채우고 새 콘텐츠를 업데이트하기 전에 위치를 저장해야합니다.
또한 새 콘텐츠의 항목 수가 다를 수 있으므로 최대 스크롤 위치와 관련하여 위치를 설정해야합니다.
샘플 코드는 다음과 같습니다
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