2012-06-07 45 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

相關問題