2009-07-16 3 views
1

이 코드에 대한 몇 가지 이유가 첫 번째 else에 도달하지 않습니까? 나는 근사한 소스에서 정확히 같은 것을 얻었다. 내 캡슐화보다. 모든 것이 잘됩니다. 창이 생성되고, 메시지가 처리되고, 이벤트가 클라이언트 영역의 keyborad 입력에 생성됩니다. gl 캔버스가 잘 작동합니다 (그리기를 강제 할 때).Windows 메시지 루프

유일한 문제는 메시지 루프가 첫 번째 if를 떠나지 않는다는 것입니다. :/ 나는 정말 붙어있다.

while (!done)          
{ 
    if (::PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) 
    { 
     if (msg.message == WM_QUIT)     
     { 
      done = TRUE;        
     } 
     else           
     { 
      ::TranslateMessage (&msg);    
      ::DispatchMessage (&msg);    
     } 
    } 
    else           
    { 
     // Code is never reaching this! 
     draw(); 
     ::SwapBuffers(hDC); 
     idle(); 
    } 
} 
return msg.wParam; 
+1

분명히 번역/발송이 완료되면 새로운 메시지를 대기열에 게시하는 것입니다. 검색된 모든 메시지를 나열하고 메시지의 유추와 이유를 추론해야합니다. – sharptooth

+0

스파이를 사용하여 hdc 0으로 WM_PAINT의 하드 플로우를 얻었습니다. 어떻게 생성되는지는 알 수 없습니다. –

답변

7

메시지 대기열이 비어 있어서는 안됩니다. 이유가 무엇입니까? 다른 프로그램에서 무엇을하는지에 따라 다릅니다. 어떤 가능성 :

  1. 코드는 큐가 비어하지 않도록하는 방식으로 큐에 새 메시지를 게시합니다. 메시지 아이디가 처리 될 때 로그 아웃하는 것이 좋습니다.

  2. 당신은 페인트 메시지를 처리하지 않습니다 - MSDN에서 : "이를 PeekMessage 함수는 일반적으로 큐에 WM_PAINT 메시지를 제거하지 않습니다 WM_PAINT WM_PAINT 메시지가있는 경우 메시지는, 그러나 그들이 처리 될 때까지 큐에 남아 있습니다.. NULL 업데이트 영역 PeekMessage 큐에서 제거합니다. "

희망이 있습니다.

[편집] 은 BeginPaint 함수와 EndPaint를 호출하거나 WM_PAINT을 제대로 처리하고 있는지 확인 DefWindowProc를 지나온

+0

은 문제가있는 것처럼 보입니다. 그러나, 내 MainWndProc WM_PAINT에서 0을 반환하고 있습니다. 내가 아는 것은 여러분이 다루는 모든 메시지가 0을 반환한다는 것입니다. 따라서 이론적으로 메시지를 남기지 않아야합니다. –

+0

WM_PAINT가 보이기 때문에 WM_PAINT를 처리하고 있습니다. –

+0

이 코드를 추가하면 예상대로 작동하기 시작합니다. 그러나 가능하다면 약간의 설명을하고 싶습니다. 경우 WM_PAINT : BeginPaint 함수 (HWND, &ps); \t EndPaint (HWND, &ps); \t 반환 0; –

0

항상 메시지가 대기 중일 수 있습니까?

0

PeekMessage는 메시지 큐에 메시지가없는 경우에만 0을 반환합니다. 메시지 대기열에 디스패치 될 메시지가 있으므로 0이 아닌 값을 반환하고 else 조건은 절대로 실행되지 않습니다.

+0

나는 그가 이것에 대해 묻고있는 것 같아요. 왜 아무 메시지도 남지 않았다고. – sharptooth

4

에 전달하거나 WM_PAINT을 처리합니다. 이로써

는 아직도 페인트 할 필요가 그렇지 않으면 당신은 응용 프로그램을 생각으로 윈도우 혼란 스러울 것입니다, 당신은 BeginPaint 함수 WM_PAINT 메시지 내부에서EndPaint를 호출해야합니다 의미한다.