//-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;
}