GDI и объединение регионов

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

Допустим нам нужно прорисовать небольшой участок слева сверху, но в то же время такой же небольшой участок справа снизу. Мы рисуем в буфере оба участка после которых идут вызовы InvalidateRect для отображения изменений.

Далее происходит стандартная цепочка

WindowCallback > WM_PAINT > BeginPaint

В WM_PAINT мы блиттим (BitBlt) из буфера в основной DC.

В подобной ситуации при втором вызове InvalidateRect новый регион автоматически объединяется со старым и BeginPaint перерисовывает практически все окно полностью.

MSDN: При установке нескольких областей производится их объединение и обработка одним WM_PAINT

Drawing Откройте изображение в новой вкладке для увеличения

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


Ответы (1 шт):

Автор решения: A-off

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

В большинстве же случаев, думаю решение от insolor с UpdateWindow будет лучше.

→ Ссылка