2012-06-07 13 views
2

CListCtrl의 가로 스크롤 막대 위치는 어떻게 유지합니까? 정기적으로 덤프하고 목록 컨트롤의 내용을 다시 채워서 이전 위치를 명시 적으로 기억하고 복원하면 스크롤이 왼쪽 상단으로 돌아갑니다.CListCtrl : 수평 스크롤 위치를 유지하는 방법?

나는 이전에 CListCtrl: How to maintain scroll position?과 관련된 질문을했지만 당시에는 필자가 수직 스크롤 위치에만 관심이 있었고 제공된 대답이이를 해결했습니다. 그러나 이제는 가로 스크롤 위치 (세로 스크롤뿐만 아니라)를 기억하고 복원하려고합니다.

답변

1

우선, 생각하는 것이 더 간단합니다. 목록을 다시 채우고 강제로 목록 컨트롤을 다시 채우고 새 콘텐츠를 업데이트하기 전에 위치를 저장해야합니다.

또한 새 콘텐츠의 항목 수가 다를 수 있으므로 최대 스크롤 위치와 관련하여 위치를 설정해야합니다.

샘플 코드는 다음과 같습니다

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을 사용하면 작동하지 않습니다.

+0

세로 스크롤 막대에 적용하면이 코드가 올바르게 작동하지 않습니다. 스크롤 썸을 움직 였지만 목록 컨트롤의 내용은 위쪽으로 스크롤 된 채로 있었고 스크롤 막대를 위/아래 화살표를 클릭하자마자 스크롤 썸이 맨 위로 휘었습니다. – StilesCrisis