Как Windows (или другие операционные системы) обновляют фоновую область клиента?

StackOverflow https://stackoverflow.com/questions/903327

Вопрос

Или, если спросить по-другому, как работает OnEraseBkgnd()?

Я создаю собственный элемент управления и столкнулся с этой проблемой.

Чайлды, как обычно, представляют собой прямоугольники.Мне пришлось запрещать OnEraseBkgnd() и я использую только OnPaint().
Что мне нужно, так это эффективно очищать пространство позади детей и без мерцания.

Такие методы, как использование задние буферы это не вариант.

Редактировать:Меня очень интересует алгоритм, скрытый в OnEraseBkgnd().Но любой полезный ответ также будет принят.

Это было полезно?

Решение

Обычно в Windows самым простым (но не самым эффективным) способом уменьшения мерцания является отключение WM_ERASEBKGND обработка уведомлений.Это потому, что если стереть фон в обработчике уведомлений, то закрасить окно в WM_PAINT обработчику, между ними существует небольшая задержка — эта задержка воспринимается как мерцание.

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

Вы можете повысить производительность отрисовки, следуя большинству обычных рекомендаций по аннулированию клиентской области — не делайте недействительным все окно, если вам это действительно не нужно.Постарайтесь признать недействительными только те области, которые изменились.Также вам следует использовать BeginDeferWindowPos функции, если вы одновременно обновляете позиции коллекции дочерних окон.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top