2015-07-28 5 views
0

Моя цель - перерисовать CListCtrl в моем приложении MFC с частотой 1 секунду, чтобы обновить его содержимое. Я использую следующий псевдокод, чтобы сделать это:Как предотвратить мерцание вертикальной полосы прокрутки в CListCtrl после перенаселения ее элементов

//CListCtrl lstLog; 

//Prevent redrawing 
lstLog.SetRedraw(FALSE); 

//Remove all items 
lstLog.DeleteAllItems(); 

for(int i = 0; i < 100; i++) 
{ 
    lstLog.InsertItem(i, str); 
} 

//Scroll to the bottom of the list 
int scrollY = lstLog.GetItemCount() * nItemHeight; 

//Allow back redrawing 
lstLog.SetRedraw(TRUE); 
lstLog.Scroll(CSize(0, scrollY)); 

Это хорошо работает, за исключением того, что вертикальная полоса прокрутки, кажется, мерцает, или быстро прыгать вверх и вниз, когда я использую этот метод.

Есть ли что-то, что я могу сделать, чтобы это предотвратить?

+0

Помогает ли вам прокрутить, прежде чем снова перекрасить? –

+0

@JonathanPotter: Знаешь, если я это сделаю, это создаст странный эффект. На первой итерации она прокручивается на дно, затем на следующей итерации она прокручивается до самого верха, а затем повторяет. Я проверил 'scrollY', и этот параметр не изменился. – c00000fd

+0

Просто полоса прокрутки делает это или сам список? –

ответ

0

Две вещи:

  • Избегайте излишне обновления ListBox. Мало того, что это время теряет время, но это будет мешать пользователю пытаться выбрать что-то из него. Старайтесь обновлять только те элементы, где это необходимо.
  • Отъезд LockWindowUpdate(). Напишите помощник RAII, который блокирует список для времени перезагрузки. Убедитесь, что вы проверили результат вызова и только отменили его в dtor, если первый вызов был успешным, чтобы не мешать вложенным вызовам.
+0

Blech, LockWindowUpdate() обычно не является хорошей идеей. –

+0

"обычно никогда"? –

+2

Ок: http://blogs.msdn.com/b/oldnewthing/archive/2007/02/21/1735472.aspx Не работает: http://blogs.msdn.com/b/oldnewthing/archive/2007/02 /22/1742084.aspx –