WinAPI:: В какой момент Виндовс пересисовывает окно?

Вопрос тупой, понимаю, но ни как не могу сложить полную картину алгоритма отрисовки окна.

Вот например, я вызвал функцию UpdateWindow, виндовс заметила не действительное окно и отправила сообщение WM_PAINT, затем, программа выбрав WM_PAINT, вызывает функцию BeginPaint, получая констекст и отмечает окно действительным. Далее я рисую в контексте то что мне нужно, и отпускаю контекст вызовом функции EndPaint.

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

Есть предположительно 2 варианта:
1) После освобождения констекста (EndPaint).
2) По таймеру постоянно опрашивает контекст окна.

Поставь опыт и получишь ответ на свой вопрос. Я предполагаю, что сразу рисует (не при EndPaint, а сразу).
Тяжёлых расчётов при обработке WM_PAINT быть не должно. Если они нужны, эти расчёты надо выполнить заранее: например, "рисовать" не на экране, а в памяти.

В GDI нет буферизации, всё что ты рисуешь выводится сразу, прямо во время выполнения вызываемых функций рисования. В этом можно легко убедиться просто запустив пошаговую отладку - каждый примитив будет выведен сразу же, как только будет выполнен соответствующий шаг.
Хотя если точнее, то GDI лишь отправляет команду драйверу устройства. А что происходит дальше (то есть когда изображение реально появится на экране или бумаге, если это принтер) - уже зависит не от GDI.

В дополнение
Что делает BeginPaint: устанавливает область отсечения (чтобы рисовалась только та часть окна, которая является недействительной), производит стирание фона если оно требуется (WM_ERASEBKGND), если в окне есть каретка (текстовый курсор) - скрывает её на время рисования, заполняет структуру PAINTSTRUCT (указатель на которую в неё передаётся), получает DC и возвращает его handle.
Что делает EndPaint: восстанавливает каретку (если она была скрыта в BeginPaint), освобождает DC.

Добавить комментарий