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

时间:2015-02-20 03:07:42

标签: c++ winapi

我一直在关注directx编程的教程,并开始学习如何编写窗口。

到目前为止,我有这个,它创建了一个空白窗口:

#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 msg并将其转换为可读的并发送它以由窗口proc函数处理。但是,我不明白窗口proc函数如何不结束程序,以及如何在输入后输入程序并不简单地关闭。如果代码是从上到下执行的,并且winmain在windowproc之前结束,为什么windowproc处理的命令是all并且结束all并且它返回到getmessage?

1 个答案:

答案 0 :(得分:3)

您的消息循环调用DispatchMessage。这会调用你的窗口程序。然后你的窗口过程返回,DispatchMessage也返回,你的循环循环。

那就是发布消息的工作方式。对于从其他线程发送的消息,它调用窗口过程的GetMessage(或者代码中不会出现但可能在默认消息处理期间使用的少数其他等待函数) 。它实际上有一个自己的循环,调用窗口过程,直到找到一条发布的消息。然后它返回,以便您可以检查消息并致电DispatchMessage

此外,GetMessageDispatchMessage可以调用许多不同的窗口过程,具体取决于邮件发送或发布的窗口。您的窗口过程将被调用与您注册的窗口类关联的窗口,因此基本上所有消息都会发送到您的主窗口。