windows c++ 一个带界面的窗口程序(附带源码)
windows c++ 一个带界面的窗口程序(附带源码)
一、项目背景详细介绍
在 Windows 平台上,“带界面的 C++ 程序”本质上就是一个 Win32 窗口程序。
与控制台程序不同,窗口程序具备以下典型特征:
-
有可视化窗口
-
通过鼠标、键盘与用户交互
-
采用消息驱动模型
-
程序运行生命周期由系统控制
虽然现在很多开发者使用 Qt、MFC、.NET 等框架,但所有 Windows GUI 技术的根基仍然是 Win32 API。
只有真正理解 Win32 窗口程序:
-
才能理解 GUI 消息模型
-
才能排查底层窗口问题
-
才能在不依赖框架的情况下开发轻量级工具
本项目的目标是:
👉 使用纯 C++ + Win32 API 编写一个“真正带界面的 Windows 程序”,并完整展示其创建、显示、交互与退出流程。
二、项目需求详细介绍
本示例窗口程序需满足以下要求:
1️⃣ 技术要求
-
使用 C++
-
使用 原生 Win32 API
-
不使用 MFC / Qt / WTL
-
Unicode 编码(宽字符)
2️⃣ 界面要求
窗口中包含:
-
一个主窗口
-
一个静态文本(Label)
-
一个编辑框(Edit)
-
一个按钮(Button)
3️⃣ 功能要求
-
用户在编辑框输入文字
-
点击按钮后弹出消息框
-
消息框内容来自编辑框
三、相关技术详细介绍
3.1 Windows GUI 程序入口
Windows 图形界面程序的入口函数是:
int WINAPI WinMain(...)
而不是 main()。
3.2 窗口与控件的关系
在 Win32 中:
控件 = 子窗口
-
主窗口:顶级窗口
-
按钮、编辑框:主窗口的子窗口
所有控件都通过 CreateWindow / CreateWindowEx 创建。
3.3 消息驱动模型
Windows 程序不是“死循环逻辑”,而是:
-
系统产生消息
-
程序从消息队列中取消息
-
系统回调窗口过程函数(WndProc)
四、实现思路详细介绍
整体程序流程如下:
程序启动 ↓ WinMain ↓ 注册窗口类 ↓ 创建主窗口 ↓ 显示窗口 ↓ 进入消息循环 ↓ WndProc 处理消息 ↓ 用户点击按钮 ↓ WM_COMMAND ↓ 读取编辑框内容 ↓ 弹出消息框 ↓ 关闭窗口 ↓ 程序退出
五、完整实现代码
// =====================================================
// 文件名:main.cpp
// 说明:Windows C++ 带界面的窗口程序(Win32 API)
// =====================================================
#include <windows.h>
// --------------------
// 控件 ID 定义
// --------------------
#define IDC_STATIC_TEXT 1001
#define IDC_EDIT_INPUT 1002
#define IDC_BUTTON_OK 1003
// 全局实例句柄
HINSTANCE g_hInstance;
// --------------------
// 窗口过程声明
// --------------------
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
// --------------------
// 程序入口(Win32 GUI 程序)
// --------------------
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE,
LPSTR,
int nCmdShow
)
{
g_hInstance = hInstance;
// 1. 定义窗口类
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WndProc; // 窗口过程
wc.hInstance = hInstance; // 实例句柄
wc.lpszClassName = L"MyWindowClass"; // 窗口类名
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
// 2. 注册窗口类
RegisterClass(&wc);
// 3. 创建主窗口
HWND hWnd = CreateWindow(
wc.lpszClassName,
L"Windows C++ 带界面的窗口程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
500, 300,
NULL,
NULL,
hInstance,
NULL
);
// 4. 显示窗口
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// 5. 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
// --------------------
// 窗口过程
// --------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HWND hEdit;
switch (msg)
{
case WM_CREATE:
// 静态文本
CreateWindow(
L"STATIC",
L"请输入内容:",
WS_CHILD | WS_VISIBLE,
30, 30, 100, 25,
hWnd,
(HMENU)IDC_STATIC_TEXT,
g_hInstance,
NULL
);
// 编辑框
hEdit = CreateWindow(
L"EDIT",
L"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
140, 30, 200, 25,
hWnd,
(HMENU)IDC_EDIT_INPUT,
g_hInstance,
NULL
);
// 按钮
CreateWindow(
L"BUTTON",
L"确定",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
140, 80, 80, 30,
hWnd,
(HMENU)IDC_BUTTON_OK,
g_hInstance,
NULL
);
break;
case WM_COMMAND:
// 按钮点击
if (LOWORD(wParam) == IDC_BUTTON_OK)
{
wchar_t buffer[256] = { 0 };
GetWindowText(hEdit, buffer, 256);
MessageBox(
hWnd,
buffer,
L"你输入的内容是",
MB_OK | MB_ICONINFORMATION
);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
六、代码详细解读(仅解读方法作用)
1️⃣ WinMain
-
Windows GUI 程序入口
-
创建窗口并启动消息循环
2️⃣ RegisterClass
-
告诉系统窗口的行为与外观
3️⃣ CreateWindow
-
创建主窗口和控件
-
控件本质是子窗口
4️⃣ 消息循环
-
保证程序持续响应用户操作
5️⃣ WndProc
-
所有窗口与控件消息的处理中心
七、项目详细总结
通过本示例,你已经完整掌握了:
✅ Windows C++ GUI 程序的基本结构
✅ 带界面的窗口创建流程
✅ 控件的创建方式
✅ 用户交互的响应机制
✅ 一个最标准的 Win32 窗口程序模板
该代码可直接作为:
-
Windows 桌面程序入门模板
-
Win32 教学示例
-
后续控件 / 菜单 / GDI 编程基础
八、项目常见问题及解答
Q1:为什么不能用 main()?
A:Windows GUI 程序必须使用 WinMain。
Q2:为什么控件要指定父窗口?
A:控件是子窗口,必须依附于父窗口存在。
Q3:按钮点击为什么在 WM_COMMAND?
A:基础控件的通知消息统一通过 WM_COMMAND 发送。
九、扩展方向与性能优化
-
添加菜单(Menu)
-
增加 ListView / TreeView
-
封装窗口为 C++ 类
-
引入多窗口管理
-
DPI / 高分辨率适配
更多推荐
所有评论(0)