0

我只是想学习一点 C++ 并写了几行,除了打开一个窗口之外什么都不做。我也添加了一个消息处理程序,通过单击窗口上的 [X],它会按预期关闭。作为下一步,我希望程序在单击 [X] 时终止,但它没有这样做。这是我的代码:

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch (msg){
    case WM_CLOSE:
        PostQuitMessage(88);
        break;
    }

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


int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE pPrevInstance, LPSTR lpCmdLine, int cCmdShow) {

    const auto pClassName = "M3D";

    WNDCLASSEX wc = { 0 };
    wc.cbSize = sizeof(wc);
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = DefWindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = nullptr;
    wc.hCursor = nullptr;
    wc.hIcon = nullptr;
    wc.hCursor = nullptr;
    wc.hbrBackground = nullptr;
    wc.lpszMenuName = nullptr;
    wc.lpszClassName = pClassName;
    RegisterClassEx(&wc);

    HWND hWnd = CreateWindowEx(0, pClassName, "Fenster M3D", WS_CAPTION | WS_MAXIMIZEBOX | WS_SYSMENU, 200, 200, 640, 480, nullptr, nullptr, hInstance, nullptr);

    //Fenster aufrufen
    ShowWindow(hWnd, SW_SHOW);
    //

    //message Pumpe
    MSG msg;
    while (GetMessage(&msg,nullptr,0,0) > 0){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

谁能告诉我什么是错的以及为什么我的 PostQuitMessage() 不能完成它的工作?我发现的其他线程并没有真正帮助

4

1 回答 1

2

问题出在这个作业上:

wc.lpfnWndProc = DefWindowProc;

您正在告诉消息循环将消息直接发送到DefWindowProc(),因此您的自定义WndProc()永远不会被使用,因此PostQuitMessage()永远不会被调用。 DefWindowProc()不要求PostQuitMessage()它处理的任何消息。

改为将此分配更改为:

wc.lpfnWndProc = WndProc;

此外,根据MSDN 上的关闭窗口文档,在处理时DefWindowProc()调用,因此您应该致电回复:DestroyWindow()WM_CLOSEPostQuitMessage()WM_DESTROY

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch (msg){
    case WM_DESTROY:
        PostQuitMessage(88);
        break;
    }

    return DefWindowProc(hWnd, msg, wParam, lParam);
}
于 2020-05-11T19:12:09.853 回答