-1

WinMain で何か問題が発生しています。私は Windows C++ プログラミングに完全に初心者です。学習しようとしています。私は私を助けるためにチュートリアルに従います。しかし、うまくいきません!これが私のコードです..

#include <Windows.h>

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = "WindowClass1";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL, "WindowClass1", "Our First Windowed app", WS_OVERLAPPEDWINDOW, 300, 300, 500, 400, NULL, NULL, hInstance, NULL);

    ShowWindow(hWnd, SW_SHOW);

    MSG msg;

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);

        DispatchMessage(&msg);
    }

    return msg.wParam;


    //return 0;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{

    switch(message)
    {
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        } break;

    }
}

コンパイルするとエラーは発生しませんが、アプリを実行すると、タスクバーにアプリのアイコンしか表示されず、それ以上は表示されません。タスク マネージャーで、アプリの 2 つのインスタンスが表示されます。

私が間違っているのは何ですか?

助けてくれてどうもありがとう!

4

2 に答える 2

7

ウィンドウプロシージャでDefWindowProcは、が呼び出されることはないため、処理しないメッセージはまったく処理されません。これには、ウィンドウを表示して通常のウィンドウのように動作させるためのいくつかの必需品が含まれます。これに適した場所はdefault、スイッチの場合です。他のすべての場合は、そのメッセージに必要な戻り値があります。

switch (message) {
    case SOME_MESSAGE:
        //...
        return 0;

    case SOME_OTHER_MESSAGE:
        //...
        return 1; //not all messages should return 0; check each one's docs

    default: //all unhandled messages
        return DefWindowProc(hWnd, message, wParam, lParam);
}

警告レベルを上げます。次の情報を取得する必要があります(少なくともGCCでは、MSVCにも同様のものがあると思います)。

警告:制御が非void関数の終わりに達しました[-Wreturn-type]

于 2012-08-03T19:07:46.743 に答える
4

WindowProcの戻り値を見逃しました。コンパイラの警告を無視しないでください...

return ::DefWindowProc(hWnd, message, wParam, lParam);
于 2012-08-03T19:08:52.400 に答える