Общий контроль двойного буфера

С точки зрения удобочитаемости это более явно говорит, что будущие читатели кода "этот материал в здесь важны, это должно быть сделано, неважно, что происходит". Это хорошо.

кроме того, пустые операторы выгоды имеют тенденцию иметь определенный "запах" им. Они могли бы быть знаком, что разработчики не продумывают различные исключения, которые могут произойти и как обработать их.

5
задан Jon Seigel 5 March 2010 в 18:47
поделиться

7 ответов

Посмотрите на использование стилей WS_EX_COMPOSITED и WS_EX_TRANSPARENT . Они обеспечивают двойную буферизацию, хотя WM_PAINT будет вызываться, когда базовое растровое изображение завершит рисование, поскольку оно рисует дочерние элементы управления снизу вверх, поэтому вы можете рисовать только только в своей оконной процедуре. Я' Я использовал его в прошлом и работает довольно хорошо.

Установите для окна верхнего уровня (контейнера) расширенный стиль WS_EX_COMPOSITED, а для дочерних окон - WS_EX_TRANSPARENT. Также не забудьте определить:

#define WINVER 0x501 

См. CreateWindowEx для получения информации о стиле композиции. Это также дает возможность делать перпиксельную прозрачность в дочерних окнах.

ОБНОВЛЕНИЕ

Как насчет использования WM_PRINTCLIENT для переноса клиентской области в растровое изображение на контроллере домена и копирования всей клиентской области в целом?

http: / /blogs.msdn.com/larryosterman/archive/2008/08/27/larry-s-new-favorite-windows-message-wm-printclient.aspx

4
ответ дан 13 December 2019 в 22:09
поделиться

действительно,

кто-то недавно опубликовал ответ на этот вопрос в одном из моих постов. Проверьте это: Вот

и не забудьте проголосовать за то, что он классный.

Код - C #, надеюсь, есть простой перевод.

0
ответ дан 13 December 2019 в 22:09
поделиться

Не зная, что именно вы делаете, я предполагаю, что вы используете для этого либо MFC, либо Win32 C.

Возможно, вы захотите изменить размер сообщения WM_SIZE. Я не уверен, где вы изменяете размер элементов управления, но я думаю, что вы делаете это во время изменения размера, поэтому это вызывает мерцание.

Также я думаю, но не знаю, вы, вероятно, могли бы использовать функцию SetWindowPos, а для uFlags иметь SWP_NOREDRAW. Хотя я не уверен, насколько хорошо это подойдет для обычных элементов управления.

0
ответ дан 13 December 2019 в 22:09
поделиться

Ларри Остерман недавно написал об этом в блоге; вы можете найти интересные подробности там .

2
ответ дан 13 December 2019 в 22:09
поделиться

Вы можете создать контекст устройства памяти, MemDC, в самом начале. Нарисуйте все в MemDC, а затем, когда окно получает сообщение WM_PAINT или становится недействительным, скопируйте MemDC в реальный DC путем побитового копирования.

Я помню, как несколько лет назад читал методику Герберта Шильдта в его книге (Программирование Windows 98 с нуля). Таким образом, вся перерисовка выполняется быстрее, поскольку вы преобразовываете постоянный ток памяти в реальный постоянный ток. Но одна большая проблема заключалась в том, какой объем памяти постоянного тока вы хотите использовать! Но он показал, как это делать. Есть загрузка кода для всех глав этой книги, опубликованной Осборном Макгроу Хиллом.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0
ответ дан 13 December 2019 в 22:09
поделиться

Вы ведь не используете WS_EX_TRANSPARENT? Это приведет к тому, что нижележащие окна будут закрашены до элементов управления, и когда нижнее окно будет стерто, вы получите мерцание.

0
ответ дан 13 December 2019 в 22:09
поделиться

Для этой цели мы используем WTL :: CDoubleBufferImpl . Мы даже рисуем вещи с помощью GDI +. Отсутствие мерцания.

Использование довольно просто: вы просто публично наследуете от WTL :: CDoubleBufferImpl и связываете его в карте сообщений ATL.

0
ответ дан 13 December 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: