Рисование без мерцания - PullRequest
       24

Рисование без мерцания

5 голосов
/ 21 сентября 2011

У меня есть приложение win32, которое было разработано на C ++.Приложение рисует некоторые вещи в окне, используя основные формы (прямоугольники).Окна перекрашиваются каждые 20 мс (50 Гц) с использованием InvalidateRect.Все работает хорошо, но рисунок мерцает.Как я могу предотвратить мерцание?В c # я обычно использую компонент с двойной буферизацией (такой как pictureBox), как я могу избавиться от этого в c ++, используя win32?

Ответы [ 4 ]

6 голосов
/ 21 сентября 2011

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

Вам также нужно отключить очистку фона (обрабатывайте WM_ERASEBKGND сообщение окна соответствующим образом) до того, как будет проведено рисование.

Редактировать: я наткнулся на довольно исчерпывающее руководство1008 * для рисования без мерцания в GDI, который объясняет все аспекты рисования в Windows и поставляется с примерами.

4 голосов
/ 21 сентября 2011

Вы также можете легко реализовать двойную буферизацию в Win32.Предполагая, что вы рисуете непосредственно в окне, используя его контекст устройства, сделайте это вместо:

Создайте контекст устройства «память» и сделайте все свои рисунки в этом контексте устройства, затем скопируйте недействительные части окнав зависимости от контекста устройства, когда это уместно, с использованием функции BitBlt()

Здесь есть довольно хороший (хотя и высокий уровень) обзор .

3 голосов
/ 21 сентября 2011

Вы также можете удвоить буфер в C ++.

Когда вы получаете DC для рисования, вы создаете закадровое растровое изображение (CreateCompatibleBitmap) и DC памяти (CreateCompatibleDC). Сделайте всю свою живопись к тому DC. В конце сделайте BitBlt из памяти DC в фактический DC.

Для повышения производительности вы можете кэшировать битовый образ вне экрана и DC, но не забывайте заново создавать их при изменении размера окна.

1 голос
/ 09 мая 2018

Вот самый лучший урок, который я нашел:

https://msdn.microsoft.com/en-us/library/ms969905.aspx

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

...