Я использую GDI + в приложении C++ / MFC, и мне просто не удается избежать мерцания при изменении размера окна.
Я уже пробовал эти шаги:
OnEraseBkGnd();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);
}
Я делаю что-то неправильно? Или есть другой способ добиться этого?





Вы можете попробовать использовать старомодный 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
Вы можете получить некоторую поддержку, используя Direct3D, чтобы «сообщить» вам, когда происходит vsync, и др., Чтобы вы могли BitBlt / обновить в нужное время. См. GDI vsync, чтобы избежать разрывов (хотя сведение всего к одному маленькому BitBlt может быть «достаточно хорошим» для некоторых случаев).
Также обратите внимание, что похоже, что GDI BitBlt не синхронизируется с vsync экрана. См. Быстрее BitBlt.
Также обратите внимание, что использование CAPTUREBLT (которое позволяет захватывать прозрачные окна) вызывает мерцание мыши (если аэро не используется), если используется.
Последнее сообщение на форуме "Быстрее BitBlt" похоже, что он недоступен с апреля 2015 года.
Эта ссылка содержит некоторую полезную информацию: http://www.catch22.net/tuts/flicker-free-drawing
(Я знаю, что это очень позднее добавление к теме, но это для всех (например, меня), кто нашел его, когда хотел уменьшить мерцание в моем приложении Win32 ...)
Это более-менее ссылка только на ответ что обескуражено. По состоянию на 11.06.2018 это выглядит как только мертвая ссылка ответ, хотя читатели должны отметить, что сайт не находился «на обслуживании» все так долго (это было в 2017 году). Лично меня это устраивает, на странице есть полезные советы. Надеюсь, он скоро вернется. Я рекомендую в любом случае включать в ответ контент со страницы (своими словами).
Похоже, описания стилей окна были перемещены в Стили классов окна.