Windowproc 如何返回到我的 GetMessage() 循环?

How does Windowproc go back to my GetMessage() loop?

我一直在关注 directx 编程教程,它从学习如何编程 window 开始。

到目前为止,我已经有了这个,它创建了一个空白 window:

#if       _WIN32_WINNT < 0x0500
  #undef  _WIN32_WINNT
  #define _WIN32_WINNT   0x0500
#endif

#define _UNICODE
#define UNICODE

#include <windows.h>
#include <windowsx.h>
#include <iostream>

using namespace std;

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 = L"WindowClass1";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL,
                          L"WindowCLass1",
                          L"Window Program",
                          WS_OVERLAPPEDWINDOW,
                          300,
                          300,
                          500,
                          400,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hWnd, nCmdShow);

    //ShowWindow( GetConsoleWindow(), SW_HIDE );

    MSG msg;

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

        DispatchMessage(&msg);
    }

    return msg.wParam;

}

LRESULT CALLBACK WindowProc(HWND hWnd,
                            UINT message,
                            WPARAM wParam,
                            LPARAM lParam)
                            {
                                switch(message)
                                {
                                case WM_DESTROY:
                                    {
                                        //ShowWindow( GetConsoleWindow(), SW_RESTORE );
                                        PostQuitMessage(0);
                                        return 0;
                                    }break;

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

到目前为止我理解它,直到 getmessage 循环。我知道它接收到 windows 消息并将其转换为可读消息并将其发送给 window proc 函数进行处理。但是,我不明白 window proc 函数如何不结束程序,以及在输入输入后程序如何不简单地关闭。如果代码是从上到下执行的,并且 winmain 在 windowproc 之前结束,为什么 windowproc 处理的命令是全部和结束,而它 returns收到消息?

您的消息循环调用 DispatchMessage。这会调用您的 window 过程。然后你的 window 过程 returns,DispatchMessage 也 returns,你的循环循环。

嗯,这就是发布消息的工作原理。对于从其他线程发送的消息,调用 window 过程的是 GetMessage(或您的代码中未出现但可能在默认消息处理期间使用的少数其他等待函数)。它实际上有自己的循环,调用 window 过程,直到找到已发布的消息。然后它 returns 这样你就可以检查消息并调用 DispatchMessage.

此外,GetMessageDispatchMessage 可以调用许多不同的 window 过程,具体取决于消息发送或发布到哪个 window。您的 window 程序被调用用于与您注册的 window class 关联的 windows,因此基本上所有消息都发送到您的主 window.