VC怎么编写 Windows 示例程序?从零到运行,一步一步教你
很多刚接触 Visual C++ 的朋友,第一步都会卡在同一个地方:到底怎么用 VC 写一个能跑起来的 Windows 示例程序?
看教程时感觉不难,真到自己上手,往往会遇到工程不会建、窗口不显示、编译报错、链接失败这些问题。
这篇文章就专门围绕“VC怎么编写Windows示例程序”来讲,尽量用最直白的方式,把从创建工程到运行出窗口的完整流程讲清楚。
如果你是新手,按步骤做就能跑起来;如果你有一点基础,也可以直接看后面的代码结构和注意事项。
一、先搞清楚:VC 写 Windows 程序到底是什么
这里说的 VC,通常指的是 Visual C++,也就是微软的 C++ 开发环境,最常见的是:
- Visual Studio 2019
- Visual Studio 2022
而所谓 Windows 示例程序,一般就是指:
- 一个能在 Windows 上运行的桌面程序
- 会弹出窗口
- 能响应鼠标、键盘、关闭按钮
- 使用 Windows API 写出来,而不是纯控制台程序
简单理解就是:
不是黑窗口程序,而是带标题栏、边框、按钮、消息响应的图形界面程序。
二、先准备好开发环境
1. 安装 Visual Studio
如果你还没装开发环境,建议直接装 Visual Studio Community 版,免费,足够学习和开发。
安装时重点勾选:
- 使用 C++ 的桌面开发
- Windows 10/11 SDK
- MSVC 编译工具
- C++ CMake 工具(可选)
2. 为什么要选“桌面开发”
因为我们这里写的是 Windows 桌面程序,不是控制台程序,也不是 Linux 程序。
没有勾选这个组件,后面你可能会发现:
- 找不到 Windows 应用模板
- 编译器缺少头文件
- 链接库不完整
三、VC 编写 Windows 示例程序的基本思路
一个最基础的 Windows 程序,核心流程通常是下面这几步:
- 注册窗口类
- 创建窗口
- 显示窗口
- 进入消息循环
- 处理窗口消息
- 响应关闭、绘图、鼠标键盘等事件
你可以把它理解成:
- 先告诉 Windows:我要创建一个什么样的窗口
- 再真的把窗口做出来
- 然后程序一直等系统传消息过来
- 比如点击关闭按钮,Windows 会发消息给程序
- 程序收到消息后做出反应
四、最基础的 Windows 示例程序代码
下面这段代码,是一个非常经典的 Win32 API 窗口程序示例。
你先别急着死记,先照着做,跑起来以后再慢慢理解。
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
const wchar_t CLASS_NAME[] = L"SampleWindowClass";
WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(
0,
CLASS_NAME,
L"VC Windows 示例程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
nullptr,
nullptr,
hInstance,
nullptr
);
if (hwnd == nullptr)
{
return 0;
}
ShowWindow(hwnd, nCmdShow);
MSG msg = {};
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
const wchar_t text[] = L"Hello, Windows!";
TextOut(hdc, 50, 50, text, lstrlen(text));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
五、怎么在 VC 里创建这个程序
方法一:直接创建空项目,自己粘贴代码
这个方式最适合新手学习,因为你能清楚看到每一步。
操作步骤:
- 打开 Visual Studio
- 点击 创建新项目
- 选择 空项目(Empty Project)
- 项目类型选 C++
- 填写项目名,比如:
WinSample - 点击创建
然后新建源文件:
- 在右侧“解决方案资源管理器”里
- 右键“源文件”
- 选择 添加 → 新建项
- 选择 C++ 文件(.cpp)
- 命名为:
main.cpp - 把上面的代码粘贴进去
接着检查字符集:
因为代码里用了 L"中文" 这种宽字符,建议:
- 打开项目属性
- 找到 高级
- 将 字符集 设置为 使用 Unicode 字符集
这样更适合 Windows API 编程。
方法二:直接创建 Windows 桌面应用模板
如果你不想从空项目开始,也可以直接建 Windows 桌面程序项目。
操作步骤:
- 创建新项目
- 搜索:Windows 桌面向导
- 选择 Windows 桌面向导
- 下一步
- 选择:
- 应用程序类型:Windows 应用程序
- 勾选:空项目
- 创建后再添加
.cpp文件
这种方式更偏正式,但对新手来说,空项目更容易理解程序结构。
六、代码到底在干什么
很多人把代码复制进去能编译,但完全看不懂。
下面我用最简单的话解释一下。
1. WinMain 是程序入口
int WINAPI WinMain(...)
这是 Windows 图形界面程序的入口函数。
和控制台程序里的 main() 类似,但 Windows 窗口程序通常用 WinMain()。
2. RegisterClass 是注册窗口类
RegisterClass(&wc);
意思是先告诉系统:
- 窗口叫什么名字
- 窗口消息交给哪个函数处理
- 这个窗口属于哪个程序
如果不注册,后面的窗口没法创建。
3. CreateWindowEx 是创建真正的窗口
HWND hwnd = CreateWindowEx(...);
这一步才是真正把窗口“造”出来。
里面有几个常见参数:
- 窗口类名
- 窗口标题
- 窗口样式
- 窗口宽高
- 初始位置
4. ShowWindow 负责显示窗口
ShowWindow(hwnd, nCmdShow);
窗口创建出来后,还要告诉它显示出来。
5. 消息循环是程序能一直运行的关键
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Windows 程序不是写完就完了,它会一直等待系统消息,比如:
- 鼠标点击
- 键盘输入
- 窗口重绘
- 最小化、关闭
这个循环就是让程序“活着”的核心。
6. WindowProc 是窗口消息处理函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
它负责处理各种消息。
比如:
WM_PAINT:窗口需要重绘WM_DESTROY:窗口被关闭- 其他消息:交给系统默认处理
七、如何编译并运行
操作步骤:
- 在 Visual Studio 顶部选择:
- 配置:
Debug - 平台:
x64或Win32
- 配置:
- 点击 生成 → 生成解决方案
- 如果没有错误,点击 调试 → 开始执行(不调试)
- 程序会弹出一个窗口
如果一切正常,你会看到一个标题为:
VC Windows 示例程序
的窗口,里面显示:
Hello, Windows!
八、常见报错和解决办法
新手写 Windows 示例程序,最容易碰到的就是下面这些问题。
1. 报错:找不到 windows.h
原因:
项目没有正确安装 C++ 开发环境,或者 SDK 没装完整。
解决方法:
- 打开 Visual Studio Installer
- 修改安装
- 勾选 使用 C++ 的桌面开发
- 确保 Windows SDK 已安装
2. 报错:WinMain 找不到
原因:
项目类型不对,可能建成了控制台程序。
解决方法:
检查项目配置:
- 子系统应为 Windows
- 不是 ConSole
检查路径:
项目属性 → 链接器 → 系统 → 子系统
设置为:
Windows (/SUBSYSTEM:WINDOWS)
3. 窗口闪退
原因:
程序启动后直接退出,通常是:
CreateWindowEx失败RegisterClass失败- 消息循环没写对
解决方法:
建议先加判断:
if (!RegisterClass(&wc))
{
MessageBox(nullptr, L"RegisterClass failed", L"Error", MB_OK);
return 0;
}
这样能快速定位问题。
4. 中文显示乱码
原因:
字符集不统一,或者宽字符 / 多字节混用。
解决方法:
- 项目字符集设为 Unicode
- 代码里尽量用
L"中文" - 统一用
wchar_t和宽字符 API
5. 程序编译通过,但窗口不显示文字
原因:
WM_PAINT 没写对,或者没有调用 BeginPaint / EndPaint
解决方法:
确保绘图代码写在 WM_PAINT 里,并且完整包裹:
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// 绘图代码
EndPaint(hwnd, &ps);
九、进阶一点:给窗口加一个按钮
如果你想让示例程序不只是显示文字,还能做点击交互,可以加一个按钮。
示例代码思路
在 WM_CREATE 里创建按钮:
case WM_CREATE:
{
CreateWindow(
L"BUTTON",
L"点我",
WS_VISIBLE | WS_CHILD,
50, 100, 100, 30,
hwnd,
(HMENU)1,
GetModuleHandle(nullptr),
nullptr
);
}
return 0;
然后在 WM_COMMAND 里处理按钮点击:
case WM_COMMAND:
if (LOWORD(wParam) == 1)
{
MessageBox(hwnd, L"按钮被点击了", L"提示", MB_OK);
}
return 0;
这样就变成了一个更完整的 Windows 示例程序。
十、一个更完整的按钮示例
下面给你一个稍微完整点的版本,方便你直接学习和修改。
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
const wchar_t CLASS_NAME[] = L"MyWinClass";
WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
if (!RegisterClass(&wc))
return 0;
HWND hwnd = CreateWindowEx(
0,
CLASS_NAME,
L"VC Windows 示例程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
nullptr,
nullptr,
hInstance,
nullptr
);
if (!hwnd)
return 0;
ShowWindow(hwnd, nCmdShow);
MSG msg = {};
while (GetMessage(&msg, nullptr, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
CreateWindow(
L"BUTTON",
L"点我",
WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
50, 100, 100, 30,
hwnd,
(HMENU)1,
GetModuleHandle(nullptr),
nullptr
);
return 0;
case WM_COMMAND:
if (LOWORD(wParam) == 1)
{
MessageBox(hwnd, L"按钮被点击了", L"提示", MB_OK);
}
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 50, 50, L"这是一个 Windows 示例程序", 14);
EndPaint(hwnd, &ps);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
十一、新手最容易踩的坑
1. 不要一上来就学太复杂的框架
很多人刚开始学 VC,就直接跳去学:
- MFC
- Qt
- DirectX
- WinUI
这些当然都能做界面,但如果你连最基础的 Windows API 程序都不会,后面会更乱。
建议顺序是:
- 先学 Win32 API 基础
- 再学消息机制
- 再学控件
- 再考虑 MFC / Qt / 现代界面框架
2. 不要混用控制台程序和窗口程序写法
控制台程序入口是:
int main()
窗口程序入口是:
int WINAPI WinMain(...)
这两个不是一回事。
如果你工程是窗口程序,却写 main(),可能会出各种问题。
3. 不要乱改字符集
Windows API 有宽字符和窄字符两套接口,新手很容易混乱。
最稳妥的办法是:
- 直接用 Unicode
- 代码里统一使用
L"字符串" - 尽量别混
char*和wchar_t*
4. 不要忽略返回值
像这些函数都可能失败:
RegisterClassCreateWindowExLoadCursorBeginPaint
新手写示例时,最好都加上判断。
不然程序闪退了,你很难知道是哪一步出错。
十二、如果你想继续深入,可以学这些内容
当你已经能写出一个基础窗口程序后,下一步建议往下面几个方向走:
1. 消息机制
理解:
WM_CREATEWM_PAINTWM_COMMANDWM_DESTROYWM_KEYDOWNWM_LBUTTONDOWN
2. 常用控件
学习:
- 按钮
- 编辑框
- 列表框
- 下拉框
- 复选框
3. 文件操作
学习怎么:
- 读写文本
- 保存配置
- 打开文件对话框
4. 绘图
学习:
- 画线
- 画矩形
- 显示图片
- 双缓冲防闪烁
5. 多线程
学习:
- 后台任务
- 窗口不卡顿
- 线程同步
这些内容学完,你就不只是会写“示例程序”,而是真的开始具备 Windows 编程基础了。
十三、总结
如果你问 VC怎么编写Windows示例程序,最核心的答案其实就是:
- 安装好 Visual Studio C++ 桌面开发环境
- 新建一个空项目
- 编写
WinMain作为入口 - 注册窗口类
- 创建窗口
- 进入消息循环
- 在
WindowProc里处理消息 - 通过
WM_PAINT、WM_COMMAND等消息实现界面和交互
对新手来说,最重要的不是一下子把所有 API 都背下来,而是先把窗口能创建出来、能显示文字、能响应按钮这几个最基本的步骤跑通。
只要这一关过了,后面学按钮、菜单、对话框、文件操作、绘图,就会顺很多。
掌握了这个最基础的 Windows 示例程序,你就已经迈进了 VC/Win32 编程的大门。

还没有评论,来说两句吧...