一、实验概述实验目的本次实验旨在掌握 Win32 Windows API 桌面程序的开发流程理解 Windows 消息驱动的程序运行机制掌握窗口类注册、窗口创建、消息循环与窗口过程函数的协作流程熟悉 GDI 绘图、光标设置、多媒体播放等基础 API 的使用方法。实验内容与设计思想本次实验基于 Windows 原生 API 设计实现一个桌面窗口程序具体要求如下 程序运行后弹出桌面窗口窗口背景为灰色窗口客户区居中显示指定文本窗口样式设置为仅保留标题栏与关闭按钮鼠标移入窗口后指针变为手型程序启动后循环播放背景音乐。核心设计思想消息驱动机制程序入口通过WinMain函数作为程序入口完成窗口类注册、窗口创建、消息循环的核心流程。窗口类注册封装窗口样式、背景、光标、窗口过程函数等属性注册后用于创建窗口实例。消息循环通过GetMessage-DispatchMessage循环不断抓取系统消息分发给窗口过程函数处理。窗口过程函数 WndProc作为消息处理核心针对WM_CREATE、WM_PAINT、WM_DESTROY等不同消息执行对应逻辑实现音频播放、文字绘制、资源释放等功能。实验使用环境操作系统Microsoft Windows 11编程环境Visual Studio 2022C Win32 桌面应用开发工具集框架与技术Windows API (Win32)、GDI 图形接口、Windows 多媒体 API二、文件结构及部分代码展示1. 文件结构本次项目为标准 Win32 桌面应用项目核心文件职责清晰主源码文件WindowsProject1.cpp包含程序入口 WinMain、窗口过程函数 WndProc是程序的核心逻辑载体。头文件framework.h、WindowsProject1.h提供框架依赖与项目预编译支持。资源文件WindowsProject1.rc管理窗口图标、版本等资源信息。音频资源hellowin.wav背景音乐文件与可执行文件同目录放置。项目文件WindowsProject1.vcxproj项目配置、WindowsProject1.sln解决方案文件。2. 头文件与库依赖#include windows.h #include mmsystem.h // 多媒体播放API头文件 // 自动链接winmm多媒体库无需手动配置项目依赖 #pragma comment(lib, winmm.lib)3. WinMain 入口函数包含窗口类注册、窗口创建、窗口居中、消息循环完整流程// 窗口过程函数声明 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // Win32程序入口函数 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 1. 设计并注册窗口类 WNDCLASSEX wc {0}; wc.cbSize sizeof(WNDCLASSEX); wc.style CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc WndProc; wc.hInstance hInstance; wc.hIcon LoadIcon(NULL, IDI_APPLICATION); wc.hCursor LoadCursor(NULL, IDC_HAND); // 设置鼠标为手型 wc.hbrBackground (HBRUSH)GetStockObject(GRAY_BRUSH); // 灰色背景 wc.lpszClassName TEXT(MyFirstWinClass); wc.lpszMenuName NULL; if (!RegisterClassEx(wc)) { MessageBox(NULL, TEXT(窗口类注册失败), TEXT(错误), MB_ICONERROR); return FALSE; } // 2. 创建指定样式的窗口 HWND hWnd CreateWindow( TEXT(MyFirstWinClass), TEXT(Windows API作业), WS_CAPTION | WS_SYSMENU, // 仅标题栏关闭按钮样式 CW_USEDEFAULT, CW_USEDEFAULT, 650, 280, NULL, NULL, hInstance, NULL ); if (!hWnd) { MessageBox(NULL, TEXT(窗口创建失败), TEXT(错误), MB_ICONERROR); return FALSE; } // 3. 窗口在屏幕居中显示 RECT winRect; GetWindowRect(hWnd, winRect); int screenW GetSystemMetrics(SM_CXSCREEN); int screenH GetSystemMetrics(SM_CYSCREEN); MoveWindow(hWnd, (screenW - (winRect.right - winRect.left)) / 2, (screenH - (winRect.bottom - winRect.top)) / 2, winRect.right - winRect.left, winRect.bottom - winRect.top, TRUE); // 4. 显示窗口 消息循环 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; while (GetMessage(msg, NULL, 0, 0)) { TranslateMessage(msg); DispatchMessage(msg); } return (int)msg.wParam; }4. WndProc 窗口过程函数处理窗口核心消息实现音频播放、文字绘制、资源释放LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { // 窗口创建完成播放背景音乐 case WM_CREATE: { PlaySound(TEXT(.\\hellowin.wav), NULL, SND_FILENAME | SND_LOOP | SND_ASYNC); break; } // 窗口重绘绘制居中文字 case WM_PAINT: { PAINTSTRUCT ps; HDC hdc BeginPaint(hWnd, ps); SetTextColor(hdc, RGB(0, 0, 0)); SetBkMode(hdc, TRANSPARENT); RECT rect; GetClientRect(hWnd, rect); DrawText(hdc, TEXT(大家好这是我的第一个Windows API程序), -1, rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); EndPaint(hWnd, ps); break; } // 窗口销毁停止音乐退出程序 case WM_DESTROY: { PlaySound(NULL, NULL, 0); PostQuitMessage(0); break; } // 其余消息交给系统默认处理 default: return DefWindowProc(hWnd, msg, wParam, lParam); } return 0; }三、核心功能说明功能需求桌面显示标准 Windows 窗口背景为灰色。窗口客户区水平 垂直居中显示指定文本 “大家好这是我的第一个 Windows API 程序”。窗口样式为仅标题栏模式只保留标题栏与关闭按钮无最大化、最小化按钮窗口不可拉伸。鼠标指针移入窗口后变为手型样式。程序启动后自动循环播放背景音乐关闭窗口后音乐停止。核心实现逻辑窗口样式控制通过CreateWindow的样式参数WS_CAPTION | WS_SYSMENU实现仅标题栏效果WS_CAPTION保留标题栏WS_SYSMENU保留关闭按钮不添加WS_MAXIMIZEBOX、WS_MINIMIZEBOX、WS_THICKFRAME从而去除最大化最小化按钮与可拉伸边框。灰色背景实现在窗口类注册时通过GetStockObject(GRAY_BRUSH)获取系统灰色画刷赋值给hbrBackground属性窗口客户区自动填充灰色背景。文字居中绘制在WM_PAINT消息中通过GetClientRect获取客户区尺寸调用DrawText函数并传入DT_CENTER水平居中、DT_VCENTER垂直居中、DT_SINGLELINE单行显示参数实现文本精准居中。手型鼠标设置注册窗口类时通过LoadCursor加载系统标准手型光标IDC_HAND赋值给hCursor属性鼠标移入窗口自动切换样式。背景音乐播放在WM_CREATE消息中调用PlaySound函数使用SND_FILENAME指定音频文件、SND_LOOP设置循环播放、SND_ASYNC设置异步播放不阻塞窗口消息窗口销毁时传入 NULL 停止播放释放资源。四、实验总结与收获1、实验总结本次实验基于 Windows 原生 API 开发了第一个 Win32 桌面窗口程序完整实现了灰色背景窗口、居中文字显示、仅标题栏窗口样式、手型鼠标、循环背景音乐等全部实验要求。程序遵循 Win32 消息驱动机制WinMain 入口完成窗口类注册与窗口创建通过消息循环不断分发系统消息WndProc 窗口过程函数针对不同消息执行对应逻辑各模块职责清晰。实验过程中通过窗口样式常量组合精准控制窗口外观利用 GDI 绘图函数实现文本居中渲染借助多媒体 API 实现后台音频播放。过程中遇到的典型问题包括中文路径导致音频无法播放、窗口样式参数错误导致出现多余按钮、文字垂直居中失效、编译时 winmm 库未链接等。经过逐一排查改用英文无空格路径、调整窗口样式常量、使用 DrawText 垂直居中参数、添加 #pragma comment 自动链接库最终程序完整运行所有功能达到实验要求。本次实验直观体现了 Windows 程序 “消息驱动、事件响应” 的核心特点与控制台顺序执行的程序逻辑有本质区别。通过亲手编写完整窗口程序建立了 Win32 API 编程的整体认知理解了窗口从创建到销毁的完整生命周期。2、实验收获1收获理解 Win32 程序运行流程掌握了 WinMain 入口→窗口类注册→窗口创建→消息循环→窗口过程函数处理消息的完整执行链路理清了消息驱动程序的核心逻辑。 掌握窗口样式控制方法学会通过组合不同的窗口样式常量定制窗口的外观与交互能力实现仅标题栏、不可拉伸等效果。 掌握 GDI 基础绘图学会在 WM_PAINT 消息中使用 BeginPaint/EndPaint 配对绘图利用 DrawText 实现文本布局与显示。 掌握多媒体 API 使用学会使用 PlaySound 函数播放 wav 音频理解同步 / 异步播放、循环播放的参数区别。 理解窗口生命周期掌握 WM_CREATE、WM_PAINT、WM_DESTROY 等核心窗口消息的触发时机与作用学会在对应消息中完成初始化、绘制、清理工作。2不足与后续改进当前程序功能较为基础仅实现了静态文本显示未加入交互功能。后续可以添加菜单、按钮等控件实现点击切换文本、切换音乐等交互效果。 当前音频仅支持 wav 格式后续可以学习使用更高级的音频 API支持 mp3 等更多格式的音频播放。 窗口美化程度较低后续可以学习自绘窗口、异形窗口等高级 GDI 技术实现更美观的界面效果。 后续将进一步学习控件开发、消息通信、多线程等 Win32 高级编程内容开发功能更完整的桌面应用。
企业数字化 ERP 产品动态
相关推荐
RTSP流媒体实战:协议原理、推流拉流与播放优化全解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:37:51
2026企业AI办公工具选型指南:从场景匹配到平台评估 企业引入AI办公工具时,很多数字化负责人容易陷入单一维度的判断误区。部分团队会直接对照产品功能清单逐项勾选,认为功能条目越多,平台价值越高;还有管理者以品牌知名度、基础订阅成本作为核心判断依据,忽略业务场景适… · 2026/9/24 15:37:45
华为设备配置避坑指南:从Console登录到NAT策略全链路实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 15:37:32
Django实现xAdmin后台根据身份设置字段只读 在Django开发的后台管理中,常常需要根据用户的身份来设置不同的权限,例如控制某些字段是否可编辑。通常情况下,xadmin允许开发者全局设置字段为只读,但更灵活的需求(如仅超级用户可编辑)则需要通过自定义来实现。
本文将通过多个步骤,介绍如何在xadmin中根据用户身份设… · 2026/9/24 16:05:01
Python个人博客项目-7.后台控制管理应用开发 在项目开发过程中,应用的创建与配置是确保整体框架结构稳定性和功能性的关键步骤。通过对应用模块的精心配置,可以实现更加灵活的扩展和高效的管理。本文以Django框架为基础,详细展示了如何通过xAdmin构建一个模块化且功能丰富的管理系统,从而实现数据的可视化管理和用户交… · 2026/9/24 16:04:54
Python个人博客项目-6.博客评论应用开发 此文带领读者深入了解新闻网站中的评论系统开发,涵盖从应用创建、配置到前端渲染等多个关键步骤。借助Django框架的多层嵌套特性以及MPTT模型,本系统为用户提供了良好的交互体验,同时确保了后台的高效管理。首先,通过简洁的项目初始化和模块化的应用配置,为开发奠定了稳固… · 2026/9/24 16:04:48
Python个人博客项目-5.统计数据应用开发 本项目围绕网站访问统计系统的设计与实现展开,旨在通过精细化的访问数据管理,为网站流量分析和用户行为研究提供支撑。项目从应用创建、数据库模型设计到数据管理及视图控制等方面,构建了多层次的访问追踪和分析结构。以Django框架为基础,系统集成了总体访问量统计、每日访… · 2026/9/24 16:04:42
Akka Streams Unzip 算子深度解析:将二元组流拆分到两个下游流 后端并发编程异步编程 【免费下载链接】akka-core A platform to build and run apps that are elastic, agile, and resilient. SDK, libraries, and hosted environments. 项目地址: https://gitcode.com/gh_mirrors/ak/akka-core 点击查看 免费下载 导读
Unzip… · 2026/9/24 16:04:36
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44