




Метод DrawItem () вызывается всякий раз, когда требуется нарисовать любой заданный элемент в списке. Если вы не ответите на него, вы, скорее всего, получите пустую область в списке, где нарисованные данные были стерты, а вы не обновили их. Если вы действительно не думаете, что рисунок необходим, вы можете сделать что-нибудь вроде
void CMyListBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
if (!m_DrawingEnabled)
return;
}
Где m_DrawingEnabled - это член, который вы поддерживаете, чтобы останавливать ненужные отрисовки,
Например, я просто хочу нарисовать новый элемент после добавления его в список или удалить определенный элемент из списка. Но я не хочу его рисовать, когда меняю размер списка.
Я не думаю, что флаг поможет, если окна попросят его перерисовать, скорее всего, рисунок потребности. Добавление флага просто ничего не отобразит. Он не сохранит то, что было нарисовано ранее.
Вы всегда можете кэшировать исходный рисунок, выводя содержимое в растровое изображение в памяти и затем отрисовывая его, это означает, что вам нужно отслеживать, когда что-то изменилось, чтобы вы могли снова запустить фактический код рендеринга. Это экономит время прохождения вашего кода рендеринга, если его много.
Я сделал именно то, что предлагает Кирон, кэшируя растровые изображения, но Только в очень дорогом коде рендеринга. На самом деле мне нужно сохранять несколько кэшированных «состояний» в зависимости от того, выделен ли элемент, отключен, нормальный и т. д. (Это для кнопок панели инструментов, а не для элемента списка, но я думаю, что это применимо). Я кэширую предварительно визуализированное изображение только тогда, когда оно мне в первый раз нужно - таким образом я кэширую только те «состояния», которые мне действительно нужны.
Мой рисунок был чистым вызовом GDI. В основном манипуляции с растровыми изображениями и прочее рисование, которое требует времени, плюс меня слишком часто перерисовывали (без уважительной причины - длинная история).
Изменение основ в используемой мною структуре (MFC и Stingray) было просто недопустимым вариантом. Кеширование было последним средством, после того как все другие оптимизации были недостаточно хороши (чертовски медленные виртуальные машины !!).
Обычно рисование - это достаточно быстро, когда вы недействительны (DrawItem в этом случае). Я бы посмотрел, что именно вы делаете в DrawItem. Я бы посмотрел на кэширование данных и вычислений, которые необходимы для рендеринга, и нет самого рендеринга (например, окончательных растровых изображений), если нет других вариантов.
Кроме того, я читал, что рендеринг Vista более оптимизирован, они кешируют то, что вы нарисовали в своем окне, чтобы уменьшить цикл включения недействительности / перерисовки, когда, например, окно перемещается из-за другого.
Кеширование промежуточных вычислений очень помогло в моей ситуации.
Когда именно вы подумаете, что DrawItem будет вызван, и его НЕ нужно перерисовывать?