Windows API窗口程序设计
一、实验概述实验目的本次实验旨在掌握 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 高级编程内容开发功能更完整的桌面应用。