使用 C++ 和 Win32 API 创建 GUI 窗口应用程序:从零构建 Windows 桌面界面
文章目录
引言
在本系列 Win32 API 教程 中,我们将带你从零开始,使用 C++ Win32 窗口示例 构建最基础的 Windows GUI 编程 应用。无需任何面向对象特性,只要你掌握 C 或 C++ 就能轻松上手。即使你以前使用过 WinForms、WPF 或 Qt,本教程也会帮助你深入理解更底层的 Win32 API。
开发环境与工具
-
IDE:Code::Blocks(亦可选用 Visual C++ 或其他 IDE)。
-
编译器:GCC(MinGW)或 Microsoft VC++(MSVC)。
-
项目类型:
- Win32 GUI 项目:含模板代码,自动链接所需库。
- Console 项目:需手动包含
<windows.h > f
,适合理解底层调用。
-
包含头文件与入口函数(WinMain 详解)
在源文件顶部添加 注册窗口类 所需的头:
#include
Win32 GUI 程序的入口函数不是 main
,而是:
int WINAPI WinMain(
HINSTANCE hInstance, // 应用实例句柄
HINSTANCE hPrevInstance, // 上一个实例(忽略)
LPSTR lpCmdLine, // 命令行参数
int nShowCmd // 窗口显示方式
);
-
WINAPI:调用约定(
__stdcall
)。 -
四个参数分别提供应用实例、旧实例、命令行字符串和启动时窗口状态。
-
测试 Win32 API 可用性(MessageBox 使用方法)
在 WinMain
中插入以下代码,验证 Win32 API 教程 环境是否就绪:
MessageBox(
nullptr, // 无父窗口
"Hello, Win32!", // 消息文本
"First GUI", // 窗口标题
MB_OK // OK 按钮
);
return 0;
编译并运行后,你将看到一个带 “OK” 按钮的对话框。
注册窗口类(RegisterClass 示例)
要创建真正的窗口,需先定义并注册一个 窗口类(WNDCLASSEXW):
-
初始化结构体
WNDCLASSEXW wc = {0};
-
设置必要成员
wc.cbSize = sizeof(WNDCLASSEXW); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; // 窗口过程 wc.hInstance = hInstance; // 应用实例 wc.hCursor = LoadCursor(nullptr, IDC_ARROW); // 默认箭头光标 wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); // 默认背景色 wc.lpszClassName = L"MyWindowClass"; // 类名
-
注册窗口类
if (!RegisterClassExW(&wc)) { MessageBox(nullptr, "注册窗口类失败!", "Error", MB_ICONERROR); return -1; }
创建窗口(CreateWindow 示例)
注册成功后,使用 CreateWindowW 创建一个可见的 Windows GUI 编程 窗口:
HWND hwnd = CreateWindowW(
L"MyWindowClass", // 窗口类名
L"My First Window", // 窗口标题
WS_OVERLAPPEDWINDOW | WS_VISIBLE, // 窗口样式
100, 100, 500, 500, // 位置与大小
nullptr, nullptr, nullptr, nullptr
);
if (!hwnd) {
MessageBox(nullptr, "创建窗口失败!", "Error", MB_ICONERROR);
return -1;
}
消息循环(Message Loop)
窗口创建后必须进入 消息循环,否则程序会立即退出:
MSG msg;
while (GetMessage(&msg, nullptr, 0, 0)) { // 获取消息
TranslateMessage(&msg); // 翻译键盘消息
DispatchMessage(&msg); // 派发给窗口过程
}
-
GetMessage:获取消息,返回
FALSE
时退出循环。 -
TranslateMessage & DispatchMessage:确保消息正确处理。
-
窗口过程(DefWindowProc 默认消息处理)
定义 WndProc 回调,实现 __WM_DESTROY 处理__ 等:
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
) {
switch (uMsg) {
case WM_DESTROY:
PostQuitMessage(0); // 退出消息循环
return 0;
default:
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
}
-
PostQuitMessage:让
GetMessage
返回FALSE
,结束程序。 -
DefWindowProc:默认处理所有未自定义的消息。
-
编译与运行
- 修复可能的编译错误(如逗号、括号错误)。
- 重新编译并运行后,你将看到一个可以 调整大小、最小化、关闭 的基础窗口。
总结与下一步
- 完成了从包含
< windows.h >
、WinMain 详解、MessageBox 使用方法 到 注册窗口类、CreateWindow 示例、消息循环、DefWindowProc 默认消息处理 的完整流程。
本文选自YouTube视频:https://www.youtube.com/watch?v=8GCvZs55mEM
热门API
- 1. AI文本生成
- 2. AI图片生成_文生图
- 3. AI图片生成_图生图
- 4. AI图像编辑
- 5. AI视频生成_文生视频
- 6. AI视频生成_图生视频
- 7. AI语音合成_文生语音
- 8. AI文本生成(中国)
最新文章
- 完整指南:如何在应用程序中集成和使用ChatGPT API
- Amazon Bedrock × Stability AI:直播配图API批量渲染7天训练营
- InterSystems IRIS 2022.2 使用 JWT 保护 REST API 教程
- API分析 – 什么是 API 分析?
- 天文信息检索服务:如何让星空探索变得触手可及?
- 如何使用DBAPI快速搭建自己的API平台
- Workers AI合作模型助力短剧制作平台脚本生成API实战
- 如何获取 GPT-OSS API 密钥(分步指南)
- 人脸识别 API 合规升级下的银行开放 API 2025 全栈实战清单
- GPT-OSS 模型驱动在线编程课 AI 助教,3 天打造追问式对话 API
- Kimi K2-0905 256K上下文API状态管理优化:长流程复杂任务实战
- Go工程化(四) API 设计上: 项目结构 & 设计