首页/新闻资讯/正文详情

Win32 GUI画图极简框架

发布时间:2026/9/26 7:32:59 来源:云帆数科 栏目:资讯中心
Win32 GUI画图极简框架
极简测试//编译运行生成task.json后应在 // ${fileDirname}\\${fileBasenameNoExtension}.exe之后添加以下内容 // , -mwindows #include windows.h LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hdc BeginPaint(hwnd, ps); HBRUSH red CreateSolidBrush(RGB(255,0,0)); RECT sq {50, 50, 150, 150}; // 局部变量安全取地址 FillRect(hdc, sq, red); DeleteObject(red); HBRUSH blue CreateSolidBrush(RGB(0,0,255)); SelectObject(hdc, blue); Ellipse(hdc, 200, 50, 300, 150); DeleteObject(blue); EndPaint(hwnd, ps); return 0; } case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProcW(hwnd, msg, wParam, lParam); } } int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nShow) { WNDCLASSW wc {0}; wc.lpfnWndProc WndProc; wc.hInstance hInst; wc.lpszClassName LDraw; wc.hbrBackground (HBRUSH)(COLOR_WINDOW1); RegisterClassW(wc); HWND hwnd CreateWindowExW(0, LDraw, L绘图, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 200, NULL, NULL, hInst, NULL); ShowWindow(hwnd, nShow); UpdateWindow(hwnd); MSG msg; while (GetMessageW(msg, NULL, 0, 0)) { TranslateMessage(msg); DispatchMessageW(msg); } return msg.wParam; }面向过程写法//编译运行生成task.json后应检查是否在 // ${fileDirname}\\${fileBasenameNoExtension}.exe之后添加了以下内容 // ,-lgdi32, -mwindows #include windows.h #include cstdlib // 绘图函数直接拿到窗口句柄绘图 void DrawPoint(HWND hwnd, int x, int y, COLORREF color) { HDC hdc GetDC(hwnd); SetPixel(hdc, x, y, color); ReleaseDC(hwnd, hdc); } void DrawLine(HWND hwnd, int x1, int y1, int x2, int y2, COLORREF color) { HDC hdc GetDC(hwnd); HPEN pen CreatePen(PS_SOLID, 1, color); HPEN oldPen (HPEN)SelectObject(hdc, pen); MoveToEx(hdc, x1, y1, nullptr); LineTo(hdc, x2, y2); SelectObject(hdc, oldPen); DeleteObject(pen); ReleaseDC(hwnd, hdc); } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { return msg WM_DESTROY ? (PostQuitMessage(0), 0) : DefWindowProcA(hwnd, msg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { //1.初始化程序 const char* className SimpleWin; WNDCLASSEXA wc{}; wc.cbSize sizeof(wc); wc.lpfnWndProc WndProc; wc.hInstance hInstance; wc.lpszClassName className; RegisterClassExA(wc); HWND hwnd CreateWindowExA(0, className, Draw Window, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, nullptr, nullptr, hInstance, nullptr ); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); // 2. 在主函数直接调用绘图函数 srand(12); for(int i 0; i 10000; i) { int x rand() % 800; int y rand() % 600; COLORREF color RGB(rand()%256, rand()%256, rand()%256); DrawPoint(hwnd, x, y, color); } DrawLine(hwnd, 200, 200, 200, 400, RGB(0, 0, 0)); DrawLine(hwnd, 200, 400, 400, 300, RGB(255, 0, 0)); DrawLine(hwnd, 400, 300, 200, 200, RGB(0, 128, 255)); // 3. 等待5秒 DWORD startTick GetTickCount(); while (GetTickCount() - startTick 5000) { MSG msg{}; if (PeekMessageA(msg, nullptr, 0, 0, PM_REMOVE)) DispatchMessageA(msg); } DestroyWindow(hwnd); // 4. 关闭窗口 return 0; }面向对象版本//编译运行生成task.json后应检查是否在 // ${fileDirname}\\${fileBasenameNoExtension}.exe之后添加了以下内容 // ,-lgdi32, -mwindows #include windows.h #include cstdlib #include string class Paint { private: HWND hwnd; DWORD startTick; int waitTime; // 保存等待时长毫秒 std::string className; // 静态窗口过程处理基本消息 static LRESULT CALLBACK WndProcStatic(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { if (msg WM_DESTROY) { PostQuitMessage(0); return 0; } return DefWindowProcA(hwnd, msg, wParam, lParam); } // 内部辅助注册窗口类 void RegisterWindowClass(HINSTANCE hInstance) { WNDCLASSEXA wc{}; wc.cbSize sizeof(wc); wc.lpfnWndProc WndProcStatic; wc.hInstance hInstance; wc.lpszClassName className.c_str(); wc.hbrBackground (HBRUSH)(COLOR_WINDOW 1); // 添加背景刷避免闪烁 RegisterClassExA(wc); } public: // 构造函数初始化窗口 Paint(HINSTANCE hInstance, const char* titleWindow, int width800, int height600) : hwnd(nullptr), startTick(0), waitTime(0), className(OOPPaintClass) { RegisterWindowClass(hInstance); hwnd CreateWindowExA( 0, className.c_str(), title, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, width, height, nullptr, nullptr, hInstance, nullptr ); if (hwnd) { ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); } } // 成员函数DrawPoint void DrawPoint(int x, int y, COLORREF color) { if (!hwnd) return; HDC hdc GetDC(hwnd); SetPixel(hdc, x, y, color); ReleaseDC(hwnd, hdc); } // 成员函数DrawLine void DrawLine(int x1, int y1, int x2, int y2, COLORREF color) { if (!hwnd) return; HDC hdc GetDC(hwnd); HPEN pen CreatePen(PS_SOLID, 1, color); HPEN oldPen (HPEN)SelectObject(hdc, pen); MoveToEx(hdc, x1, y1, nullptr); LineTo(hdc, x2, y2); SelectObject(hdc, oldPen); DeleteObject(pen); ReleaseDC(hwnd, hdc); } // 成员函数Wait // 接受外部传参的延时毫秒数保存到 waitTime并记录开始时间 void Wait(int ms) { waitTime ms; startTick GetTickCount(); } // 析构函数等待指定时间后关闭窗口 ~Paint() { if (waitTime 0) { // 延时循环同时处理消息以保持窗口响应 while (GetTickCount() - startTick (DWORD)waitTime) { MSG msg{}; // 使用 PM_REMOVE 取出消息并分发防止界面无响应 if (PeekMessageA(msg, nullptr, 0, 0, PM_REMOVE)) { DispatchMessageA(msg); } } } if (hwnd) { DestroyWindow(hwnd); hwnd nullptr; } } }; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { Paint obj1(hInstance, Object 1: Points); srand(12); for(int i 0; i 10000; i) { int x rand() % 800; int y rand() % 600; COLORREF color RGB(rand()%256, rand()%256, rand()%256); obj1.DrawPoint(x, y, color); } Paint obj2(hInstance, Object 2: Lines); obj2.DrawLine(200, 200, 200, 400, RGB(0, 0, 0)); obj2.DrawLine(200, 400, 400, 300, RGB(255, 0, 0)); obj2.DrawLine(400, 300, 200, 200, RGB(0, 128, 255)); obj1.Wait(3000); obj2.Wait(5000); return 0; }

相关推荐

在线 JS 格式化  压缩工具
在线 JS 格式化 压缩工具

前言 在日常前端开发工作中,我们经常会遇到两类场景:线上拉取的 JS 代码是压缩后的一行字符串,完全没有换行与缩进,调试起来非常痛苦;还有发布上线前,需要把开发环境带有注释、换行的 JS 源码压缩&#xf… · 2026/9/26 7:32:47

Robomongo 第三方依赖自动编译与静态链接机制解析:QJson 与 QScintilla 的构建集成实战
Robomongo 第三方依赖自动编译与静态链接机制解析:QJson 与 QScintilla 的构建集成实战

数据库客户端桌面应用 【免费下载链接】robomongo Native cross-platform MongoDB management tool 项目地址: https://gitcode.com/gh_mirrors/ro/robomongo 点击查看 免费下载 导读 Robomongo 是一款原生跨平台 MongoDB 图形化管理工具,其桌面客户端… · 2026/9/26 7:32:47

ng-zorro-antd InputNumber 受控模式越界值:`out-of-range` 警告样式机制详解
ng-zorro-antd InputNumber 受控模式越界值:`out-of-range` 警告样式机制详解

UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 导读 在 ng-zorro-antd 的 nz-input-number 数字输入框中,当以受控模式… · 2026/9/26 7:32:47

OCR识别与条码预处理技术实践指南
OCR识别与条码预处理技术实践指南

我无法根据您提供的输入内容生成符合要求的博文。 原因如下: 项目正文为空,关键词为空,摘要描述为空; 所有可用信息仅剩标题“清雨剑挑码助手2015资源下载:提升工作效率的强大助手”及热搜词“清雨剑挑码助手2015”… · 2026/9/26 8:45:49

Cortex 多实例类型集群配置指南:混合 CPU/GPU/Inferentia 节点组与 Spot 优先级最佳实践
Cortex 多实例类型集群配置指南:混合 CPU/GPU/Inferentia 节点组与 Spot 优先级最佳实践

后端云原生模型推理服务MLOps人工智能 【免费下载链接】cortex Production infrastructure for machine learning at scale 项目地址: https://gitcode.com/gh_mirrors/co/cortex 点击查看 免费下载 导读 Cortex 允许在同一集群中配置多个不同规格、不同计费模式&… · 2026/9/26 8:45:49

Atlas 300V 24G NPU推理卡实战:从YOLO模型转换到部署调优
Atlas 300V 24G NPU推理卡实战:从YOLO模型转换到部署调优

前几天私信里又蹦出一条问题:“Atlas 300V 24G 是不是运算加速卡?我想用它跑YOLO做目标检测,能不能像GPU那样直接开干?”这个问题我最近已经回答过好几轮了。不怪大家问,Atlas这个名字在AI硬件圈出现的频率越来越高&am… · 2026/9/26 8:45:49

体育馆预约平台源码拆解:SpringBoot+Vue+MyBatis企业级实现
体育馆预约平台源码拆解:SpringBoot+Vue+MyBatis企业级实现

企业级体育馆预约平台源码拆解:从业务模型到落地实践如果你在学校体育馆、商业球馆或者单位文体中心待过,一定见过这样的场景:高峰期场地被挤爆,空闲时段却空着没人来;前台电话被预约咨询打到占线;几个人同… · 2026/9/26 8:45:49

Agent技能库实战:从巨型Prompt到可加载能力单元的设计与落地
Agent技能库实战:从巨型Prompt到可加载能力单元的设计与落地

做Agent应用做得多了,你会发现一个很扎心的规律:项目前期最耗时的往往不是写代码,而是“调那个越来越长的Prompt”。今天能回答,明天答非所问,加一个功能就要在系统提示词里再叠一段,最后连自己都分不清哪条… · 2026/9/26 8:45:49

Unity图集优化实战:从DrawCall原理到Sprite Atlas踩坑指南
Unity图集优化实战:从DrawCall原理到Sprite Atlas踩坑指南

atlas这个词,第一次跑进我的Unity工程,是在一个特别普通的下午。项目在低端测试机上跑得磕磕绊绊,UI界面一跳到战斗结算,FPS直接掉到20出头,Profiler面板里DrawCall的数字红得刺眼。后来定位到罪魁祸首——十几个散装小… · 2026/9/26 8:45:43

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码