Win32 API 实战:从零构建窗口程序,5步完成消息循环与绘图
Win32 API 实战5步构建完整窗口程序与消息循环1. 环境准备与基础概念Windows图形界面程序开发的核心是Win32 API这是一组由微软提供的C语言函数库用于创建窗口、处理消息和绘制界面。与常见的控制台程序不同Win32程序采用事件驱动模型这意味着程序流程由用户操作和系统事件决定。开发环境要求Visual Studio 2019或更高版本Windows SDK通常随VS自动安装基础C/C知识关键术语解析HINSTANCE程序实例句柄标识当前运行的程序HWND窗口句柄唯一标识一个窗口消息循环Windows程序的核心机制用于接收和处理系统消息#include windows.h // 必须包含的核心头文件2. 窗口创建四部曲2.1 定义窗口处理函数每个窗口都需要一个处理函数来响应各种事件LRESULT CALLBACK WindowProc( HWND hwnd, // 窗口句柄 UINT uMsg, // 消息ID WPARAM wParam, // 附加信息 LPARAM lParam // 附加信息 ) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); }2.2 注册窗口类向系统注册窗口的样式和行为WNDCLASS wc {0}; wc.lpfnWndProc WindowProc; // 设置窗口处理函数 wc.hInstance hInstance; // 程序实例句柄 wc.lpszClassName MyWindow; // 窗口类名 RegisterClass(wc); // 注册窗口类2.3 创建窗口实例HWND hwnd CreateWindowEx( 0, // 扩展样式 MyWindow, // 窗口类名 Win32 Demo, // 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口样式 // 位置和大小 CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, // 父窗口 NULL, // 菜单 hInstance, // 实例句柄 NULL // 附加数据 );2.4 显示窗口ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 强制重绘窗口3. 消息循环实现Windows程序的核心是消息循环它不断从系统获取并分发消息MSG msg {0}; while (GetMessage(msg, NULL, 0, 0)) { TranslateMessage(msg); // 转换键盘消息 DispatchMessage(msg); // 分发到窗口处理函数 } return (int)msg.wParam;消息处理流程详解GetMessage从消息队列获取消息TranslateMessage转换键盘输入为字符消息DispatchMessage调用对应的窗口处理函数4. GDI绘图基础Windows图形设备接口(GDI)提供了基本的绘图功能4.1 基本绘图步骤case WM_PAINT: { PAINTSTRUCT ps; HDC hdc BeginPaint(hwnd, ps); // 绘制矩形 Rectangle(hdc, 100, 100, 300, 200); // 绘制文本 TextOut(hdc, 150, 150, Hello Win32, 11); EndPaint(hwnd, ps); return 0; }4.2 创建自定义画笔和画刷HPEN hPen CreatePen(PS_SOLID, 3, RGB(255, 0, 0)); // 红色实线画笔 HBRUSH hBrush CreateSolidBrush(RGB(0, 0, 255)); // 蓝色实心画刷 // 选入设备上下文 HGDIOBJ hOldPen SelectObject(hdc, hPen); HGDIOBJ hOldBrush SelectObject(hdc, hBrush); // 绘制图形 Ellipse(hdc, 200, 200, 400, 300); // 恢复原有对象 SelectObject(hdc, hOldPen); SelectObject(hdc, hOldBrush); // 删除GDI对象 DeleteObject(hPen); DeleteObject(hBrush);5. 完整示例与调试技巧5.1 完整可编译代码#include windows.h LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hdc BeginPaint(hwnd, ps); // 绘制蓝色矩形 HBRUSH hBrush CreateSolidBrush(RGB(0, 0, 255)); FillRect(hdc, ps.rcPaint, hBrush); DeleteObject(hBrush); // 绘制白色文本 SetTextColor(hdc, RGB(255, 255, 255)); TextOut(hdc, 50, 50, Win32窗口程序示例, 12); EndPaint(hwnd, ps); return 0; } case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 注册窗口类 WNDCLASS wc {0}; wc.lpfnWndProc WindowProc; wc.hInstance hInstance; wc.lpszClassName MyWindowClass; RegisterClass(wc); // 创建窗口 HWND hwnd CreateWindowEx( 0, MyWindowClass, Win32示例, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL ); if (hwnd NULL) return 0; // 显示窗口 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg {0}; while (GetMessage(msg, NULL, 0, 0)) { TranslateMessage(msg); DispatchMessage(msg); } return (int)msg.wParam; }5.2 调试技巧输出调试信息AllocConsole(); // 创建控制台窗口 freopen(CONOUT$, w, stdout); // 重定向标准输出 printf(调试信息: %d\n, value); // 输出调试信息检查API调用结果if (!RegisterClass(wc)) { MessageBox(NULL, 窗口类注册失败!, 错误, MB_ICONERROR); return 0; }使用Visual Studio调试器设置断点观察消息处理流程查看窗口句柄和消息参数使用输出窗口查看调试信息

相关新闻

测试V模型:单元测试-> 集成测试->系统测试->验收测试

测试V模型:单元测试-> 集成测试->系统测试->验收测试

概述 测试的 V 模型 是一种、 /。 软件开发模型,它强调开发和测试活动一一对应、同步进行。 从结构上看,它呈一个 V 字形,左侧是开发阶段(从上到下细化),右侧是测试阶段(从下到上集成),底部是编码与执行。 V 模型将测试活动与开发各阶段明确地对应起来: 需求分析…

2026/7/12 23:19:06 阅读更多 →
视觉文档检索实战:使用llama-nemotron-embed-vl-1b-v2-fp8处理PDF图像和OCR文本的完整指南

视觉文档检索实战:使用llama-nemotron-embed-vl-1b-v2-fp8处理PDF图像和OCR文本的完整指南

视觉文档检索实战:使用llama-nemotron-embed-vl-1b-v2-fp8处理PDF图像和OCR文本的完整指南 【免费下载链接】llama-nemotron-embed-vl-1b-v2-fp8 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/llama-nemotron-embed-vl-1b-v2-fp8 想要构建高效的多模…

2026/7/12 23:17:05 阅读更多 →
NVIDIA Llama-Nemotron-Colembed-VL-3B-V2 vs v1:性能提升与架构改进对比分析

NVIDIA Llama-Nemotron-Colembed-VL-3B-V2 vs v1:性能提升与架构改进对比分析

NVIDIA Llama-Nemotron-Colembed-VL-3B-V2 vs v1:性能提升与架构改进对比分析 【免费下载链接】llama-nemotron-colembed-vl-3b-v2 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/llama-nemotron-colembed-vl-3b-v2 在人工智能快速发展的今天&#x…

2026/7/12 23:17:05 阅读更多 →

最新新闻

单片机光学自动打靶机寻点流程分析

单片机光学自动打靶机寻点流程分析

光学自动打靶机寻点流程分析Y轴自动加减速寻点程序通过分析图寻点机制实现精确定位,支持负数存储(如454负数案例)及仿真取模运算。硬件层面明确定义引脚功能,软件端集成字库旋转技术以优化显示效果,配套图解代码提供直…

2026/7/13 0:25:25 阅读更多 →
Wireshark 4.4.7 协议栈解析:从物理帧到HTTP的7层数据拆解实战

Wireshark 4.4.7 协议栈解析:从物理帧到HTTP的7层数据拆解实战

Wireshark 4.4.7 协议栈解析:从物理帧到HTTP的7层数据拆解实战当我们在浏览器输入一个网址按下回车时,背后究竟发生了什么?作为网络工程师或开发者,理解数据如何在协议栈中逐层封装与解封装至关重要。本文将带你使用Wireshark 4.4…

2026/7/13 0:25:25 阅读更多 →
Source Insight 4.0 与 VS Code 代码导航对比:5个维度实测,解析遗留代码维护效率差异

Source Insight 4.0 与 VS Code 代码导航对比:5个维度实测,解析遗留代码维护效率差异

Source Insight 4.0 与 VS Code 代码导航对比:5个维度实测,解析遗留代码维护效率差异在当今快速迭代的软件开发环境中,代码导航工具的效能直接影响开发者的生产力。面对庞大的遗留代码库,如何快速理解代码结构、追踪调用关系成为技…

2026/7/13 0:25:25 阅读更多 →
医药管理系统

医药管理系统

1 开发技术 1.1 Java 介绍 Java 是由 Sun 公司于 1995 年推出的一种面向对象编程语言,具有跨平台、安全性高、生态成熟等特点。Java 程序运行在 JVM 之上,可实现“一次编写,到处运行”,在企业级 Web 开发中应用广泛,…

2026/7/13 0:21:24 阅读更多 →
宿舍管理系统

宿舍管理系统

1 开发技术 1.1 Java 介绍 Java 是由 Sun 公司于 1995 年推出的一种面向对象编程语言,具有跨平台、安全性高、生态成熟等特点。Java 程序编译后运行于 Java 虚拟机(JVM)之上,遵循“一次编写,到处运行”的设计理念&am…

2026/7/13 0:21:24 阅读更多 →
基于深度学习的停车场管理与车牌识别检测系统31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于深度学习的停车场管理与车牌识别检测系统31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于深度学习的停车场管理与车牌识别检测系统31(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 本项目已经训练好模型,配置好环境可直接使用,运行效果见图像如图。该项目有登陆系统和非登陆系统两种,自由可选…

2026/7/13 0:21:24 阅读更多 →

日新闻

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:01:19 阅读更多 →
浦东旧模块回收哪家强?专业评测带你一探究竟

浦东旧模块回收哪家强?专业评测带你一探究竟

于科技迅猛飞速迭代的当下此刻, 旧模块的回收处置, 不但关联着资源的再度利用, 而且更牵扯到数据安全以及环保合规事宜。你是不是也正为那堆积得如同山峦般的旧模块而发愁? 是不是不清楚该怎样安全且高效地去处理它们? 别忧心烦恼, 就在今日, 我会以具备权威影响力的自媒体博…

2026/7/13 0:01:19 阅读更多 →
卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

1 研究背景与现存技术痛点(提出问题)基因工程、蛋白质组学、生物制药研发流程中,蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈:传统离子交换、分子筛层析无特异性…

2026/7/13 0:05:20 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/12 0:03:13 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/12 0:03:14 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/12 0:03:14 阅读更多 →

月新闻