Как Windows (или другие ОС) обновляют фоновую область клиента? - PullRequest
2 голосов
/ 24 мая 2009

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

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

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

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

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

1 Ответ

3 голосов
/ 24 мая 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...