GDI и объединение регионов
Имеем окно, его контекст и контекст устройства в памяти (совместимый контекст в качестве бэк буфера). В большинстве случаев нам удобнее не создавать дополнительные окна для мелких элементов, а рисовать все в рамках одного контекста.
Допустим нам нужно прорисовать небольшой участок слева сверху, но в то же время такой же небольшой участок справа снизу. Мы рисуем в буфере оба участка после которых идут вызовы InvalidateRect для отображения изменений.
Далее происходит стандартная цепочка
WindowCallback > WM_PAINT > BeginPaint
В WM_PAINT мы блиттим (BitBlt) из буфера в основной DC.
В подобной ситуации при втором вызове InvalidateRect новый регион автоматически объединяется со старым и BeginPaint перерисовывает практически все окно полностью.
MSDN: При установке нескольких областей производится их объединение и обработка одним WM_PAINT
Откройте изображение в новой вкладке для увеличения
Исходя из этого вопрос,- можно ли как-то оптимизировать этот процесс чтобы ограничить "дорогостоящее" рисование лишь изначальными небольшими участками не отрисовывая окно "целиком", или любым другим образом?
Ответы (1 шт):
В конечном счете решил вопрос рисованием в обход WM_PAINT, благо конкретно этот частный случай позволяет это сделать. Не пришлось добавлять лишний код в обработчик (что тоже было бы вариантом, но тут это лишнее).
В большинстве же случаев, думаю решение от insolor с UpdateWindow будет лучше.