1

私は小さなゲームをプログラミングしていて、lpfnWndProcDefWindowProcに設定し 、その後、そのようにループを作成しました。

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

では、その場合、ウィンドウを閉じるイベントをどのように処理しますか?

4

2 に答える 2

2

まず第一に、これはメッセージ ループの書き方ではありません。メッセージの待機中に 100% の CPU を使用し、他のウィンドウのメッセージをキューから削除しません。また、終了することもありません。メッセージ ループの例については、こちらを参照してください。

ウィンドウを閉じることについて:DefWindowProcは自動的に処理WM_CLOSEし、ウィンドウを破棄します。ウィンドウが閉じられたときにアプリケーションを終了させたい場合は、それを処理WM_DESTROYして呼び出す必要がありますPostQuitMessage(0)。これは、代わりに独自のウィンドウ プロシージャが必要になることを意味しますDefWindowProc

于 2009-11-01T10:34:47.247 に答える
0
  1. WindowProc をクラスで処理したい場合は、次のようにします

    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;
      }
    }
    

もちろん、'this' を最後のパラメーターとして CreateWindow(Ex) に渡します。

次に、メッセージ ループで WM_QUIT メッセージをチェックし、それをキューとして使用してループを終了する必要があります。また、hwnd でフィルターを実行しないでください。これにより、アプリケーション ループがスレッド上の他のウィンドウにメッセージをディスパッチできなくなります。また、多くの Windows ライブラリは、スレッド上にメッセージ ウィンドウを作成して、プロセス間 (およびスレッド) 通信を容易にします。すべての Windows メッセージを処理しないと、(a) ゲームが最終的にメモリ不足になり、(b) アプリケーションが IPC メッセージをデッドロックまたはタイムアウトにするため、システム全体がおかしくなり始める可能性があります。

また、WM_CLOSE は (通常) PostMessage ではなく、SendMessage を介して送信されます。送信されたメッセージはウィンドウ プロシージャに直接配信され、アプリ ループでフィルター処理することはできません。

于 2009-11-01T21:38:04.130 に答える