Windows下最基本的窗口程序。

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

// 入口函数WinMain
int WINAPI WinMain(HINSTANCE hInstance,                   // 当前应用程序实例的句柄
        HINSTANCE hPrevInstance,                          // 前一个应用程序实例的句柄
        LPSTR  lpCmdLine,                                 // 命令行
        int   nShowCmd)                                   // 显示状态
{
    static TCHAR szAppName[] = TEXT("Hello");
    WNDCLASS wc;
    HWND hWnd;
    MSG msg;

    // 注册窗体类
    wc.style  = CS_HREDRAW | CS_VREDRAW;                  // 窗口类风格
    wc.lpfnWndProc = WndProc;                             // 窗口回调函数
    wc.cbClsExtra = 0;                                    // 窗口类附加数据,设为0即可
    wc.cbWndExtra = 0;                                    // 窗口附加数据,设为0即可
    wc.hInstance = hInstance;                             // 拥有窗口类的应用程序句柄
    wc.hIcon  = LoadIcon(NULL, IDI_APPLICATION);          // 窗口图标
    wc.hCursor  = LoadCursor(NULL, IDC_ARROW);            // 窗口内使用的光标形状
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 用于着色窗口的画刷
    wc.lpszMenuName = NULL;                               // 指向菜单资源名的指针
    wc.lpszClassName = szAppName;                         // 指向窗口类名的指针,不能为NULL

    if (!RegisterClass(&wc))
    {
        MessageBox(NULL, "Start failed!", NULL, MB_ICONERROR);
        return 0;
    }

    // 创建窗口实例
    hWnd = CreateWindow(szAppName,                        // 窗口名称,不能为NULL
            szAppName,                                    // 窗口标题
            WS_OVERLAPPEDWINDOW,                          // 窗口风格
            CW_USEDEFAULT,                                // 初始x方向坐标
            CW_USEDEFAULT,                                // 初始y方向坐标
            CW_USEDEFAULT,                                // 初始x方向大小
            CW_USEDEFAULT,                                // 初始y方向大小
            NULL,                                         // 父窗口句柄
            NULL,                                         // 菜单句柄
            hInstance,                                    // 应用程序实例句柄
            NULL);                                        // 附加数据,一般为0

    // 显示窗口
    ShowWindow(hWnd, nShowCmd);

    // 重画窗口
    UpdateWindow(hWnd);

    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0))                  // 取出消息队列中的第一个消息,取到WM_QUIT时返回0
    {
        TranslateMessage(&msg);                           // 翻译消息
        DispatchMessage(&msg);                            // 将消息传递给msg中指定的窗口过程
    }

    return msg.wParam;

}

                                     // 窗口过程函数WndProc
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch (Msg)
    {
        case WM_DESTROY:                                  // 用户关闭窗口时窗口将收到该消息
            PostQuitMessage(0);                           // 在消息队列中插入一个WM_QUIT消息
            return 0;
    }

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