//-mwindows -lgdi32
// 包含Windows系统API头文件,所有窗口、按钮、绘图都靠它
#include <windows.h>
// 包含字符串处理函数,strlen()计算文字长度用
#include <cstring>

// 定义输入框的ID号,方便程序识别哪个是输入框
#define IDC_EDIT 1001
// 定义按钮的ID号,方便程序识别哪个是按钮
#define IDC_BUTTON 1002

// ==============================================
// 窗口消息处理函数(核心!所有窗口动作都在这里)
// hWnd:窗口句柄(相当于窗口的身份证)
// msg:消息编号(点击、绘图、关闭等)
// wParam/lParam:消息附带的数据
// ==============================================
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    // 判断收到的是什么消息
    switch(msg)
    {
        // 消息1:窗口刚创建时执行
        case WM_CREATE:
            // 创建输入框(能打字的地方)
            CreateWindowA(
                "EDIT",            // 控件类型:输入框
                "",                // 初始文字为空
                WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL,  // 样式:可见、子窗口、带边框、可横向输入
                40, 30,            // 位置:距离左上角X=40,Y=30
                240, 28,           // 大小:宽240,高28
                hWnd,              // 父窗口是主窗口
                (HMENU)IDC_EDIT,   // 设置ID号
                ((LPCREATESTRUCT)lParam)->hInstance,  // 获取程序实例
                NULL               // 扩展参数不用
            );
            
            // 创建按钮
            CreateWindowA(
                "BUTTON",          // 控件类型:按钮
                "显示文字+画画",    // 按钮上显示的文字
                WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,  // 样式:可见、子窗口、普通按钮
                40, 70,            // 位置:X=40 Y=70
                240, 35,           // 大小:宽240 高35
                hWnd,              // 父窗口
                (HMENU)IDC_BUTTON, // 按钮ID
                ((LPCREATESTRUCT)lParam)->hInstance,
                NULL
            );
            break;

        // 消息2:按钮点击、控件操作都会触发
        case WM_COMMAND:
            // 判断是不是我们的按钮被点击了
            if(LOWORD(wParam) == IDC_BUTTON)
            {
                InvalidateRect(hWnd, NULL, TRUE);  // 让窗口刷新(清空重绘)
                UpdateWindow(hWnd);                // 立刻执行重绘
            }
            break;

        // 消息3:窗口绘图(画文字、画图形都在这里)
        case WM_PAINT:
        {
            PAINTSTRUCT ps;             // 绘图需要的结构体
            HDC hdc = BeginPaint(hWnd, &ps);  // 开始绘图,获取绘图工具

            char txt[256];              // 定义数组,存放输入框的文字
            // 读取输入框里的文字,存到txt里
            GetWindowTextA(GetDlgItem(hWnd, IDC_EDIT), txt, 256);
            
            // 在窗口上输出文字:X=40 Y=130,输出txt里的内容
            TextOutA(hdc, 40, 130, txt, strlen(txt));
            // 在窗口上输出固定文字:X=40 Y=160,文字“绘图功能正常!”,长度12
            TextOutA(hdc, 40, 160, "绘图功能正常!", 12);

            // ===================== 填充颜色核心代码开始 =====================
            // 1. 创建红色画刷(填充矩形用)
            HBRUSH hRedBrush = CreateSolidBrush(RGB(255, 0, 0));
            // 2. 把画刷选入绘图工具
            HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hRedBrush);
            // 画矩形:左上角(40,190) 右下角(140,260) → 自动填充红色
            Rectangle(hdc, 40, 190, 140, 260);

            // 3. 创建蓝色画刷(填充圆形用)
            HBRUSH hBlueBrush = CreateSolidBrush(RGB(0, 0, 255));
            SelectObject(hdc, hBlueBrush);
            // 画圆形/椭圆:外框矩形(170,190)到(270,260) → 自动填充蓝色
            Ellipse(hdc, 170, 190, 270, 260);

            // 恢复默认画刷,释放资源
            SelectObject(hdc, hOldBrush);
            DeleteObject(hRedBrush);
            DeleteObject(hBlueBrush);
            // ===================== 填充颜色核心代码结束 =====================

            // 移动画笔到起点(40,290)
            MoveToEx(hdc, 40, 290, NULL);
            // 画直线到终点(270,290)
            LineTo(hdc, 270, 290);

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

        // 消息4:窗口关闭时执行
        case WM_DESTROY:
            PostQuitMessage(0);  // 退出程序
            break;

        // 其他消息交给系统默认处理
        default:
            return DefWindowProcA(hWnd, msg, wParam, lParam);
    }
    return 0;
}

// ==============================================
// 程序入口(主函数)
// ==============================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR cmd, int nShow)
{
    WNDCLASSA wc = {0};        // 定义窗口类结构体
    wc.lpfnWndProc = WndProc;  // 绑定消息处理函数
    wc.hInstance = hInstance;  // 程序实例
    wc.lpszClassName = "DrawDemo";  // 窗口类名(随便起)
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);  // 窗口背景白色
    RegisterClassA(&wc);       // 注册窗口类

    // 创建主窗口
    HWND hWnd = CreateWindowA(
        "DrawDemo",           // 用刚才注册的类
        "文字+绘图",          // 窗口标题
        WS_OVERLAPPEDWINDOW,  // 普通窗口样式
        100,100,              // 窗口在屏幕的位置X=100 Y=100
        340,380,              // 窗口宽340 高380
        NULL,NULL,hInstance,NULL
    );

    ShowWindow(hWnd, nShow);   // 显示窗口
    UpdateWindow(hWnd);        // 刷新窗口

    MSG msg;
    // 消息循环:让窗口一直显示,等待操作
    while(GetMessage(&msg,0,0,0))
    {
        TranslateMessage(&msg);  // 翻译消息
        DispatchMessage(&msg);   // 分配消息给处理函数
    }
    return 0;
}