2009-11-17 2 views
1

OpenGL 콘텐츠를 보여주는 3 개의 MDI 창이있는 응용 프로그램이 있습니다. XP에서는 모든 것이 잘 작동합니다. 그러나 Vista/Win7에서 mdi 하위 창은 제대로 새로 고쳐지지 않습니다.WM_PAINT 메시지없이 OpenGL 창이 지워졌습니다.

시작 후 모든 창은 내용이 올바르게 표시됩니다. 그러나 포커스를 하나의 MDI 창에서 다음 mdi 창으로 변경하면이 두 창은 지워집니다 (즉, 흰색 만 표시하고 내용은 표시되지 않음). 윈도우즈가 왜 지워지는지 전혀 알지 못합니다. 그런 일이 발생하면 WM_ * 메시지를받지 못합니다. 물론 WM_PAINT 메시지도받지 못합니다.

해당 창 크기를 조정할 때 WM_SIZE 뒤에 WM_PAINT 메시지가 제대로 표시되고 콘텐츠를 다시 그리지 만 창 크기가 조정되어 크기가 조정되는 동안 이상한 깜박임이 발생합니다. 크기 조정이 중지 된 후 수동으로 새로 고침을 적용 할 때까지 창은 지워져 있습니다 (흰색).

이것은 Aero가 활성화되거나 비활성화 되어도 독립적으로 발생합니다.

왜 이런 일이 발생하는지 알고 싶습니다.

답변

2

XP에서 작동하는 것에 놀랐습니다. OpenGL을 사용하여 저의 (제한된) 경험에서, WM_PAINT는 항상 OpenGL 씬을 다시 그릴 수있는 최고의 장소는 아닙니다. 대부분의 콘텐츠는 드라이버 수준에서 닦아지고 있습니다. MDI 창 중 하나가 두 개의 서로 다른 비디오 카드에 연결된 두 개의 모니터에 걸쳐있을 때 어떤 일이 발생하는지 확인하면이 사실을 확인할 수 있습니다.

  1. 다시 초기화하여 OpenGL을 컨텍스트 WM_SIZE가 발생한 후 :

    은 다음보십시오.

  2. WM_PAINT 대신 온 디맨드를 그리십시오. WM_PAINT에 대한 처리기에서 아무것도하지 마십시오. 타이머 또는 다른 메커니즘을 사용하여 디스플레이 업데이트를 주기적으로 트리거하십시오.
  3. 일반적으로 깜박임은 WM_ERASEBKGND를 통한 간섭으로 인해 발생합니다. WM_ERASEBKGND를 인터셉트하고 OpenGL 컨텐트를 표시하는 영역에서는 아무 것도하지 않습니다.
  4. OpenGL 콘텐츠를 호스팅하는 모든 창에서 CS_OWNDC 창 스타일을 사용하면 HDI가 MDI 창의 수명 동안 메시지 당/통화 당 변경하지 않도록 할 수 있습니다. (당신이 MDI 창을 사용하고 있기 때문에) 적용 할 수있는 간섭

기타 드문 원인

  1. WM_NCPAINT 및 기타 관련 비 클라이언트 그리기 당신이 아이에 OpenGL을 내용을 이동하여 다음을 해결할 수 있습니다 messages- MDI 창 안쪽에 테두리가없는 창.
  2. 명시 적으로 오버레이가 필요하거나 암시 적으로 사용하는 비디오 카드의 OpenGL에 대한 기본 기능이 잘못되었거나 호환되지 않습니다 (겹치는 상황에서 자주 발생하는 문제). 불행히도이 사실을 내 지식 영역에서 진단하지만 일부 테스트는 여기에 몇 가지 추가 빛을 줄 수 있습니다.
+0

모든 힌트를 주셔서 감사합니다. 내가 사무실에 돌아 오면 곧 이들을 시험해 보겠다. – Stefan

+0

np. 또한 컨텍스트 초기화 코드의 스 니펫을 게시하여 더 깊은 OpenGL 사용 경험을 가진 사람들로부터 더 나은 응답을 얻을 수도 있습니다. – meklarian

+0

게임 루프를 사용하지 않는 한 WM_PAINT에 응답하여 그립니다. 모든 것을 그릴 경우 WM_ERASEBKGND를 무시하고 깜박임을 피하기 위해 아무 작업도 수행하지 마십시오. 특정 상황에서 다른 문제가 발생합니다 (예 : OpenGL 명령을 플러시하지 않음). – gast128

관련 문제