Окно OpenGL очищено без сообщения WM_PAINT - PullRequest
1 голос
/ 17 ноября 2009

У меня есть приложение с тремя окнами MDI, все из которых отображают содержимое OpenGL. На ХР все работает нормально. Но в Vista / Win7 дочерние окна mdi не обновляются должным образом.

После запуска все окна правильно отображают свое содержимое. Но когда я переключаю фокус с одного окна mdi на другое, эти два окна очищаются (то есть, они показывают только белый, без содержимого). Я понятия не имею, почему окна очищаются, они не получают никакого сообщения WM_ *, когда это происходит, и, конечно, также не получают сообщения WM_PAINT.

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

Это происходит независимо от того, включен или отключен Aero.

Есть идеи, почему это происходит?

1 Ответ

2 голосов
/ 17 ноября 2009

Я удивлен, что это работает на XP. По моему (ограниченному) опыту работы с OpenGL, WM_PAINT не всегда является лучшим местом для перерисовки сцен OpenGL. Скорее всего, содержимое стирается на уровне драйвера. Вы можете проверить это, увидев, что происходит, когда одно из ваших окон MDI охватывает два монитора, подключенных к двум разным видеокартам.

Попробуйте следующее:

  1. Повторно инициализируйте контексты OpenGL после появления WM_SIZE.
  2. Рисовать по требованию, а не в WM_PAINT. В вашем обработчике для WM_PAINT ничего не делайте. Используйте таймер или другой механизм для периодического запуска обновлений ваших дисплеев.
  3. Мерцание обычно вызывается помехами через WM_ERASEBKGND. Если вы этого еще не сделали, перехватите WM_ERASEBKGND и ничего не делайте в регионах, где вы отображаете контент OpenGL.
  4. Используйте стиль окна CS_OWNDC для любых окон, в которых размещается контент OpenGL, чтобы HDC не менялся для каждого сообщения / вызова в течение срока службы окон MDI.

Другие более редкие причины помех, которые могут возникнуть (поскольку вы используете окна MDI)

  1. WM_NCPAINT и другие связанные сообщения рисования, не относящиеся к клиенту. Вы можете обойти их, переместив содержимое OpenGL в дочернее окно без рамки внутри окон MDI.
  2. Неправильные / несовместимые функции по умолчанию для OpenGL на вашей видеокарте, которые явно требуют наложения или неявно используют их (частая причина проблем в перекрывающихся контекстах). К сожалению, диагностировать это из моей области знаний, но некоторые тесты могут пролить некоторый дополнительный свет здесь.
...