2009-11-01 5 views
1

나는 작은 게임을 프로그래밍하고있어, 나는 DefWindowProc를 지나온 lpfnWndProc를 설정하고 그 후, 나는 그 방법으로 루프했다 : 나는 창 닫기를 처리 어떻게 그래서어떻게 Window를 올바르게 파괴 할 수 있습니까?

MSG lastMessage; 
while (true) 
{ 
    if (PeekMessage(
    &lastMessage, 
    this->getWindow(), 
    0, 0, 
    PM_REMOVE)) 
    { 
    TranslateMessage(&lastMessage); 
    DispatchMessage(&lastMessage); 
    } 
} 

을 이 경우 이벤트가 발생 했습니까? 모든

답변

2

첫째, 이것은 당신이 메시지 루프를 작성하는 방법되지 않습니다 :이 메시지를 기다리는 동안 100 %에게 CPU를 취할 것입니다, 큐에서 다른 창에 대한 메시지를 제거하지 않습니다. 또한 결코 끝나지 않을 것입니다. 메시지 루프의 예는 here을 참조하십시오. 폐쇄 창에 대해

: DefWindowProc 자동 WM_CLOSE을 처리하고 창을 파괴 할 것이다. 당신은 윈도우가 닫힐 때 응용 프로그램이 종료하려면 WM_DESTROY를 처리하고 그것에서 PostQuitMessage(0)를 호출해야합니다. 즉, DefWindowProc 대신 자신의 window procedure이 필요합니다. 당신이 WindowProc 클래스에 의해 처리하려면

+0

는 내가 잠을하기 위해 다이렉트 장치 -> 현재 기능을 사용하는거야, 그것은 100 %의 CPU 할게요 알고있다. DefWindowProc 대신 내 자신의 함수를 쓸 수 있다는 것을 알고 있습니다. 하지만 클래스를 사용하고 있으며 클래스에서 의 메시지를 처리하고 싶습니다. 콜백을 사용할 수 없기 때문에 콜백을 사용할 수 없습니다. 범위 또는 정적 범위. DefWindowProc가 WM_CLOSE를 처리하지 못하게 할 방법이 있습니까? –

+0

정말로 윈도우 프로 시저를 원하지 않는다면 메시지가'WM_CLOSE' 일 때 DispatchMessage를 호출하는 것을 피할 수 있다고 가정합니다. – interjay

+2

모든 창에 대해 모든 메시지를 처리해야합니다. 대기열에서 제거하지 않으면 누가 처리할까요? 그들은 단지 당신의 메시지 대기열을 구축하고 결국 꺼내게 될 것입니다. –

0
  1. , 당신은

    class CWindow 
    { 
        static LRESULT WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) 
        { 
        CWindow* self; 
        if(uMsg == WM_CREATE) 
        { 
         self = (CWindow*)((LPCREATESTRUCT)lParam)->lplpCreateParams; 
        } 
        else 
         self = GetWindowLong(hwnd,GWL_USERDATA); 
        if(self){ 
         switch(uMsg){ 
         case WM_CREATE: 
         return self->OnCreate(hwnd,(LPCREATESTRUCT)lParam); 
         case WM_CLOSE: 
         self->OnClose(); 
         return 0; 
         // etc. 
         } 
        } 
        return DefWindowProc(hwnd,uMsg,wParam,lParam); 
        } 
        int OnCreate(HWND hwnd,LPCREATESTRUCT lpcs) 
        { 
        m_hwnd = hwnd; 
        SetWindowLong(m_hwnd,GWL_USERDATA,this); 
        return 0; 
        } 
    } 
    

같은 것을 전달하는 과정을 잘 만들기 할 '이'CreateWindow 함수 (예) 마지막 매개 변수로 . 다음, 당신의 메시지 루프에서, 당신은 WM_QUIT 메시지를 확인해야하고, 루프를 종료 큐으로 그것을 사용

. 또한 응용 프로그램 루프가 스레드의 다른 창에 대한 메시지를 보내지 못하게하므로 hwnd에 필터를 사용하지 마십시오. 그리고 많은 윈도우 라이브러리는 인터 프로세스 (와 스레드) 통신을 용이하게하기 위해 쓰레드에 메시지 윈도우를 생성합니다. 모든 윈도우 메시지를 처리하지 않으면 게임에서 결국 메모리가 부족해질 것이며 (b) 응용 프로그램이 IPC 메시지를 교착 상태로 만들거나 시간이 초과되면 전체 시스템이 재미있을 것입니다.

또한 WM_CLOSE는 sendMessage 첨부하지 PostMessage를 통해 전송 된 (일반적으로)이다. 보낸 메시지는 바로 창 proc에 전달되며 앱 루프에서 필터링 할 수 없습니다.

관련 문제