// 告诉编译器链接Windows图形库(Dev-C++必须加参数:-mwindows -lgdi32)
#include <windows.h>

// ====================== 窗口消息处理函数(系统自动调用)======================
// 作用:处理窗口的所有事件(创建、关闭、画图、按键等)
// 参数解释(固定格式,必须这么写):
// hWnd     : 当前窗口的句柄(相当于窗口的身份证号)
// msg      : 消息编号(比如创建消息、关闭消息、绘图消息)
// wParam   : 消息附带的附加数据(不同消息含义不同)
// lParam   : 消息附带的附加数据
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // 根据消息类型执行不同逻辑
    switch(msg)
    {
        // 消息1:窗口创建成功时触发
        case WM_CREATE:
            break;  // 纯白窗口,无需额外操作

        // 消息2:窗口需要绘图时触发(保证窗口是白色)
        case WM_PAINT:
        {
            PAINTSTRUCT ps;             // 绘图信息结构体(系统用)
            HDC hdc = BeginPaint(hWnd, &ps); // 开始绘图,获取绘图工具句柄

            // 填充白色背景(纯白窗口核心)
            RECT rect;                  // 矩形区域结构体
            GetClientRect(hWnd, &rect); // 获取窗口客户区大小
            HBRUSH whiteBrush = CreateSolidBrush(RGB(255,255,255)); // 创建白色画刷
            FillRect(hdc, &rect, whiteBrush);                      // 用白色画刷填充窗口
            DeleteObject(whiteBrush);                               // 释放画刷资源

            EndPaint(hWnd, &ps);       // 结束绘图
            break;
        }

        // 消息3:点击窗口右上角关闭按钮时触发
        case WM_DESTROY:
            PostQuitMessage(0); // 关闭程序,退出消息循环
            break;

        // 默认消息:系统自动处理(如窗口拖动、缩放等)
        default:
            return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}

// ====================== 程序入口(相当于main函数)======================
// WINAPI:固定调用约定,Windows程序必须写
// hInst      : 当前程序的实例句柄(程序身份证号)
// hPrev      : 废弃参数,固定写NULL
// cmd        : 命令行参数
// nShow      : 窗口显示方式(显示/隐藏)
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmd, int nShow)
{
    // ===================== 1. 注册窗口类 =====================
    WNDCLASSA wc;               // 窗口类结构体(定义窗口样式)
    wc.style         = 0;       // 窗口样式(0=默认)
    wc.lpfnWndProc   = WndProc; // 绑定消息处理函数
    wc.cbClsExtra    = 0;       // 类额外内存(不用填0)
    wc.cbWndExtra    = 0;       // 窗口额外内存(不用填0)
    wc.hInstance     = hInst;   // 绑定程序实例
    wc.hIcon         = NULL;    // 窗口图标(NULL=默认)
    wc.hCursor       = NULL;    // 鼠标样式(NULL=默认箭头)
    wc.hbrBackground = NULL;    // 背景(我们手动绘制白色,所以填NULL)
    wc.lpszMenuName  = NULL;    // 菜单(无菜单填NULL)
    wc.lpszClassName = "WhiteWindow"; // 窗口类名(自定义名字)

    RegisterClassA(&wc); // 向系统注册窗口类

    // ===================== 2. 创建窗口 =====================
    HWND hWnd = CreateWindowA(
        "WhiteWindow",        // 窗口类名(必须和注册一致)
        "纯白窗口",           // 窗口标题栏文字
        WS_OVERLAPPEDWINDOW,  // 窗口样式(有标题栏+关闭按钮)
        100,                  // 窗口在屏幕的 X 坐标
        100,                  // 窗口在屏幕的 Y 坐标
        400,                  // 窗口宽度
        600,                  // 窗口高度
        NULL,                 // 父窗口(无父窗口填NULL)
        NULL,                 // 菜单(无菜单填NULL)
        hInst,                // 程序实例句柄
        NULL                  // 额外数据(不用填NULL)
    );

    // ===================== 3. 显示&更新窗口 =====================
    ShowWindow(hWnd, nShow);  // 显示窗口
    UpdateWindow(hWnd);       // 刷新窗口,立即显示

    // ===================== 4. 消息循环(保持窗口不关闭) =====================
    MSG msg; // 消息结构体
    while(GetMessage(&msg, NULL, 0, 0)) // 持续获取消息
    {
        TranslateMessage(&msg); // 翻译消息(如键盘按键)
        DispatchMessage(&msg);  // 把消息交给 WndProc 处理
    }

    return 0; // 程序结束
}