Winapi Двухфункциональная буферизация
-
29-09-2019 - |
Вопрос
Приложение WinAPI по умолчанию не имеет двухфункциональной буферизации. Вместо этого он делает очень, очень хорошую работу, чтобы обеспечить только то, что нужно нарисовать, и это дает ему бесшовную внешность. Однако, когда вы разместите окно, вся вещь должна быть перерисована, и это вызывает мерцание между элементами управления, фоном на вкладке, а иногда и белый из вкладки.
Таким образом, мой вопрос, какой самый простой способ поддержать двойную буферизацию в моем приложении?
Решение
Создайте растровое изображение в размере окна, рендерируйте это растровое изображение и свяжитесь с обратно в окно, когда вы закончите.
Вы можете сделать довольно прямое замену на месте в вашем существующем коде. Вместо того, чтобы использовать контекст устройства, который отображается в окно, используйте один, который отображается в растровое изображение, и используйте оригинальный DC для Blit Bitmap обратно.
Обязательно сохраните растровое изображение - не создавайте его в каждом вызове краски. Вам просто нужно воссоздать его, когда окно изменяется.
Другие советы
Посмотрите на следующую статью: Flicker-Free Displays, используя неэкранный DC.
В этой статье описана методика для рисования в контексте окна устройства (DC) таким образом, чтобы экран не мерцал. Техника очень проста и простой в реализации.
Я узнал, как предотвратить мерцание из этого урока несколько лет назад.