Метод DrawItem () выполняется многократно

Я использовал нарисованную владельцем стратегию для класса CMyListBox, производного от CListBox. Я хочу, чтобы метод DrawItem () выполнялся только тогда, когда я вставляю элемент в список. Но метод вызывается много раз. Как я могу изменить его, чтобы вызывать его, когда мне нужно.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 846
3

Ответы 3

Метод DrawItem () вызывается всякий раз, когда требуется нарисовать любой заданный элемент в списке. Если вы не ответите на него, вы, скорее всего, получите пустую область в списке, где нарисованные данные были стерты, а вы не обновили их. Если вы действительно не думаете, что рисунок необходим, вы можете сделать что-нибудь вроде

void CMyListBox::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
   if (!m_DrawingEnabled)
     return;
}

Где m_DrawingEnabled - это член, который вы поддерживаете, чтобы останавливать ненужные отрисовки,

Когда именно вы подумаете, что DrawItem будет вызван, и его НЕ нужно перерисовывать?

Aardvark 29.10.2008 15:43

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

user26404 29.10.2008 16:10

Я не думаю, что флаг поможет, если окна попросят его перерисовать, скорее всего, рисунок потребности. Добавление флага просто ничего не отобразит. Он не сохранит то, что было нарисовано ранее.

Aardvark 29.10.2008 16:26

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

Я сделал именно то, что предлагает Кирон, кэшируя растровые изображения, но Только в очень дорогом коде рендеринга. На самом деле мне нужно сохранять несколько кэшированных «состояний» в зависимости от того, выделен ли элемент, отключен, нормальный и т. д. (Это для кнопок панели инструментов, а не для элемента списка, но я думаю, что это применимо). Я кэширую предварительно визуализированное изображение только тогда, когда оно мне в первый раз нужно - таким образом я кэширую только те «состояния», которые мне действительно нужны.

Мой рисунок был чистым вызовом GDI. В основном манипуляции с растровыми изображениями и прочее рисование, которое требует времени, плюс меня слишком часто перерисовывали (без уважительной причины - длинная история).

Изменение основ в используемой мною структуре (MFC и Stingray) было просто недопустимым вариантом. Кеширование было последним средством, после того как все другие оптимизации были недостаточно хороши (чертовски медленные виртуальные машины !!).

Обычно рисование - это достаточно быстро, когда вы недействительны (DrawItem в этом случае). Я бы посмотрел, что именно вы делаете в DrawItem. Я бы посмотрел на кэширование данных и вычислений, которые необходимы для рендеринга, и нет самого рендеринга (например, окончательных растровых изображений), если нет других вариантов.

Кроме того, я читал, что рендеринг Vista более оптимизирован, они кешируют то, что вы нарисовали в своем окне, чтобы уменьшить цикл включения недействительности / перерисовки, когда, например, окно перемещается из-за другого.

Кеширование промежуточных вычислений очень помогло в моей ситуации.

cjbarth 26.02.2013 22:48

Другие вопросы по теме