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

 Смежные вопросы

  • Нет связанных вопросов^_^