2010-12-22 3 views
2

아마도 일종의 총체적 감시 일 뿐이지 만 메시지 루프에는 WM_SIZE 메시지가 수신되지 않습니다. 그러나 나는 그들을 WndProc에서 받는다. Windows 루프가 WndProc에 메시지를 보냈다고 생각 했나요? 는 Windows 메시지 큐가의 그 지하 세계의 다른 곳에서 DefWindowProc를 지나온에 나있는 동안 메시지가 당신의 창에 시스템에 의해 전송되는 경우Windows 메시지 Bizarreness

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
     // this message is read when the window is closed 
    case WM_DESTROY: 
     { 
      // close the application entirely 
      PostQuitMessage(0); 
      return 0; 
     } break; 
    case WM_SIZE: 
     return 0; 
     break; 
    } 
    printf("wndproc - %i\n", message); 
    // Handle any messages the switch statement didn't 
    return DefWindowProc (hWnd, message, wParam, lParam); 
} 

... 지금은 메시지 루프 ...

while(TRUE) 
{ 
    // Check to see if any messages are waiting in the queue 
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    { 

     // translate keystroke messages into the right format 
     TranslateMessage(&msg); 
     // send the message to the WindowProc function 
     DispatchMessage(&msg); 

     // check to see if it's time to quit 
     if(msg.message == WM_QUIT) 
     { 
      break; 
     } 
     if(msg.message == WM_SIZING) 
     { 
      printf("loop - resizing...\n"); 
     } 
    } 
    else 
    { 
     //do other stuff 
    } 
} 

답변

7

, 그 메시지는 당신의 메시지 루프에 전혀 보이지 않을 것입니다.

보낸 메시지에만 해당됩니다. 게시 된 메시지가 메시지 루프에 표시됩니다.

모든 메시지를 필터링하려면 스레드 ID와 함께 적절한 Set 유형의 SetWindowsHookEx를 사용하십시오. 또는 WndProc에서 적절하게 처리하는 것이 더 좋습니다.

+0

또한 ... 자신의 창 UI 스레드가 자체적으로 (예 : 다른 메시지 처리 중일 때) 대기열에 들어 가지 않는 명시 적 또는 암시 적 SendMessage를 수행하면 몇 가지 내부 기능을 거쳐 결국 WndProc 직접. 그래서 WM_CREATE에 SetWindowText를 사용할 수 있습니다. – martona

+0

게시 된 메시지와 보낸 메시지의 +1 : SendMessage는 메시지를 직접 windowproc에 전달합니다. –

3

크기 조정 그리퍼를 가지고있는 동안 Windows가 자체 메시지 루프를 실행하고 있다고 생각합니다. 메시지 대기열로 보내 지지만 크기 조정이 진행되는 동안 루프가 그림에서 벗어납니다.

프레임 창은 모든 후속 마우스 메시지를 캡처하기 위해 SetCapture를 호출합니다. 그런 다음 마우스가 움직일 때 창의 크기를 조절합니다. 또한 메시지 루프를 펌핑합니다. 비슷한 코드를 볼 수 있습니다 : ftp://ftp.ringdale.com/support/Nlynx/Tech%20Support%20Docs/Midrange/EmeraldSeries/ADK/DDE/C/APITERM/TRACK.C. 해당 기능의 중간에있는 메시지 루프에 주목하십시오.

크기 조정 추적이 완료 될 때까지 크기 조정 코드를 반환 할 필요가 없도록 큐 자체를 펌프 처리합니다.

편집 : 크기를 조정할 때 전체 창을 업데이트하는 동적 크기 조정이 나올 때까지 창 크기 조정이 작동하는 방식으로 창 크기 조정이 사용되는 방식이므로 추적 사각형 코드가 표시됩니다. 내부적으로 비슷한 행동을하는 것 같습니다.

편집 2 : 아직 게시 된 메시지와 보낸 메시지를 언급 ​​한 사용자에게 여전히 신용이 있습니다 ... 보낸 메시지는 메시지 펌프를 통과하지 않습니다. 보낸 메시지는 빠르게 wnd proc 함수 호출로 종결됩니다. 다른 스레드가 소유 한 창으로 보내지지 않으면 훨씬 더 복잡해집니다. 그들은 목적지 스레드의 메시지 대기열에 속한 내부 대기열에 추가되고, 게시 된 메시지가 반환되기 전에 내부적으로 처리됩니다. GetMessage. 보낸 메시지의 반환 값을 원본 스레드로 다시 가져 오는 작업에는 더 많은 회전이 필요합니다.

0

WM_SIZING 및 WM_SIZE는 동일한 메시지가 아닙니다. 윈도우의 크기를 조정하는 일반적인 마우스 조작은 WM_SIZING을 먼저 보내고, 어떤 프로그램이 WM_SIZE 메시지를 보낸다면 WM_SIZING없이 WM_SIZE를 얻는다.

관련 문제