Уменьшите мерцание с помощью GDI + и C++

Я использую GDI + в приложении C++ / MFC, и мне просто не удается избежать мерцания при изменении размера окна.

Я уже пробовал эти шаги:

  • вернул TRUE на OnEraseBkGnd();
  • вернул NULL на OnCtlColor();
  • используется двойная буферизация по этому коду:

void vwView::OnDraw(CDC* pDC) 
{
   CRect rcClient;
   GetClientRect(rcClient);

   Bitmap bmp(rcClient.Width(), rcClient.Height());
   Graphics graphics(&bmp);

   graphics.DrawImage(m_image, rcClient.left, rcClient.top);

   Graphics grph(pDC->m_hDC);
   grph.DrawImage(&bmp, 0, 0);
}

Я делаю что-то неправильно? Или есть другой способ добиться этого?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
21
0
22 824
5

Ответы 5

Вы можете попробовать использовать старомодный GDI вместо GDI + для записи в DC, тем более что вы уже буферизуете изображение. Используйте Bitmap :: LockBits для доступа к необработанным данным растрового изображения, создайте структуру BITMAPINFO и используйте SetDIBitsToDevice для отображения растрового изображения.

Есть ли в форме дочерние окна? Диспетчер окон начинает с того, что заставляет родительское окно стереть свой фон, отправляя сообщение WM_ERASEBKGND, ЗАТЕМ оно отправляет сообщение wM_PAINT - предположительно, это отображается на ваш метод wx :: OnDraw. Затем он перебирает каждый дочерний элемент управления и заставляет их раскрашивать себя.

Если это ваш сценарий ... использование Vistas new aero look решит вашу проблему, поскольку оконный менеджер рабочего стола aero выполняет компоновку окон автоматически. Со старым оконным менеджером это лаваш.

Убедитесь, что класс окна для окна не включает в свой стиль флаги CS_VREDRAW и CS_HREDRAW.

См. http://msdn.microsoft.com/en-us/library/ms633574(VS.85).aspx

Похоже, описания стилей окна были перемещены в Стили классов окна.

jrh 11.06.2018 18:15

Вы можете получить некоторую поддержку, используя Direct3D, чтобы «сообщить» вам, когда происходит vsync, и др., Чтобы вы могли BitBlt / обновить в нужное время. См. GDI vsync, чтобы избежать разрывов (хотя сведение всего к одному маленькому BitBlt может быть «достаточно хорошим» для некоторых случаев).

Также обратите внимание, что похоже, что GDI BitBlt не синхронизируется с vsync экрана. См. Быстрее BitBlt.

Также обратите внимание, что использование CAPTUREBLT (которое позволяет захватывать прозрачные окна) вызывает мерцание мыши (если аэро не используется), если используется.

Последнее сообщение на форуме "Быстрее BitBlt" похоже, что он недоступен с апреля 2015 года.

jrh 11.06.2018 18:10

Эта ссылка содержит некоторую полезную информацию: http://www.catch22.net/tuts/flicker-free-drawing

(Я знаю, что это очень позднее добавление к теме, но это для всех (например, меня), кто нашел его, когда хотел уменьшить мерцание в моем приложении Win32 ...)

Это более-менее ссылка только на ответ что обескуражено. По состоянию на 11.06.2018 это выглядит как только мертвая ссылка ответ, хотя читатели должны отметить, что сайт не находился «на обслуживании» все так долго (это было в 2017 году). Лично меня это устраивает, на странице есть полезные советы. Надеюсь, он скоро вернется. Я рекомендую в любом случае включать в ответ контент со страницы (своими словами).

jrh 11.06.2018 18:12

Другие вопросы по теме