2

メインループ(私の関数)にこのコードを使用します:

    while (running)
{
    if(is_close)
    {
        Log().push_log("close", "message close!", logInfo);
        running = active = false;

        break;
    }

    while (PeekMessage(&msg, g_hWnd, 0, 0, PM_REMOVE))
    {
        std::cout << "Wnd: " << msg.message << std::endl;

        if (msg.message == WM_QUIT || msg.message == WM_DESTROY || msg.message == WM_CLOSE)
        {
            MessageBox(0, "Hello, World", "Hello", MB_OK);
            running = false;
        }
        // TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    if (running && active)
        render.DrawObject(g_hDC);
}

それでは、WndProc を使用します。

LRESULT CALLBACK GLWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    std::cout << "Wnd Proc: " << msg << std::endl;

    return DefWindowProc(hWnd, msg, wParam, lParam);
}

WM_QUIT関数でメッセージ、WM_DESTROY、またはを取得しようとするとWM_CLOSE、機能しません。関数でメッセージが表示されません。

このメッセージを受け取るにはどうすればよいですか?

4

1 に答える 1

11

PeekMessage または GetMessage は、PostMessage() でメッセージ キューにポストされたメッセージのみを返します。WM_CLOSE または WM_DESTROY になることはありません。これらのメッセージは SendMessage() で送信され、ウィンドウ プロシージャに直接配信され、メッセージ キューには入りません。コードに PostQuitMessage() 呼び出しがない限り、WM_QUIT は取得されません。

メイン ウィンドウのウィンドウ プロシージャを実際に作成する必要があります。WM_DESTROY を処理して PostQuitMessage(0) を呼び出すだけで十分です。

LRESULT CALLBACK GLWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (msg == WM_DESTROY) PostQuitMessage(0);
    return DefWindowProc(hWnd, msg, wParam, lParam);
}

これで、ゲーム ループで WM_QUIT を取得できます。

于 2013-09-16T12:35:23.247 に答える