7

これが私のメインループです。

    while(TRUE)
    {

    PeekMessage(&msg,hWnd,0,0,PM_REMOVE);
        if (msg.message==WM_QUIT)
            break;
        TranslateMessage(&msg);
        DispatchMessage(&msg);


    }

これが私のコールバック手順です。

 LRESULT CALLBACK WinProc(HWND hWnd,UINT msg1,WPARAM wParam,LPARAM lParam)
 {
    switch(msg1)
    {
        case WM_DESTROY  :
        {
            PostQuitMessage(0);
            return 0;
        }
        break;
    }

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

[閉じる]ボタンを押すと、次のループでPeekMessage関数によってWM_NCLBUTTONDOWNが返され、WM_QUITは返されないことがわかりました。

4

3 に答える 3

5

メッセージループを実行する正しい方法は次のとおりです。

BOOL bRet;
MSG msg;
while ((bRet = GetMessage(&msg, hWnd, 0, 0)) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
}

本当に必要な場合に使用できPeekMessageます...しかし、なぜ戻り値を無視するのですか?

また、これはウィンドウに固有であることに注意してください。スレッドPostQuitMessage用だと思います...頭のてっぺんから覚えていませんが、の代わりにパスする必要があるかもしれません。NULLhWnd

他のウィンドウがある場合は、メッセージループも乗っ取られる可能性があります。通常は問題ではないと思いますが、問題になる可能性があります。心に留めておきます。

于 2012-05-29T19:25:09.843 に答える
2

これが私が見つけたいくつかのコードです。それはあなたに何かを与えるはずです。

    // Main message loop:
do
{
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

    // Run game code here.
    gTradeApp->ExecuteNextAction();
}
while (msg.message != WM_QUIT);

およびWndProc

LRESULT CALLBACK WndProc(HWND aHWnd, UINT aMessage, WPARAM aWParam, LPARAM aLParam)
{
    switch (aMessage)
    {
    case WM_COMMAND:
        return HandleCommand(aHWnd, aMessage, aWParam, aLParam);

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(aHWnd, aMessage, aWParam, aLParam);
    }

    return 0;
}
于 2012-05-29T19:37:20.300 に答える
0

GetMessageによって返されるエラー(-1)を適切に処理できるように、これに固執することをお勧めします。

while(GetMessage(&Msg, NULL, 0, 0) > 0) {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}

また、別のエラーがWM_CLOSEを適切に処理していません。代わりにこれを試して、プログラムが実際にWM_CLOSE(閉じるボタン)をリッスンするようにしてください。

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    switch(Message) {
        case WM_CLOSE: {
            DestroyWindow(hwnd); // this
            break;
        }
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }
    return 0;
 }
于 2012-05-29T19:26:52.053 に答える