VC怎么编写Windows示例程序

老刘

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 程序,核心流程通常是下面这几步:

  1. 注册窗口类
  2. 创建窗口
  3. 显示窗口
  4. 进入消息循环
  5. 处理窗口消息
  6. 响应关闭、绘图、鼠标键盘等事件

你可以把它理解成:

  • 先告诉 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 里创建这个程序

方法一:直接创建空项目,自己粘贴代码

这个方式最适合新手学习,因为你能清楚看到每一步。

操作步骤:

  1. 打开 Visual Studio
  2. 点击 创建新项目
  3. 选择 空项目(Empty Project)
  4. 项目类型选 C++
  5. 填写项目名,比如:WinSample
  6. 点击创建

然后新建源文件:

  1. 在右侧“解决方案资源管理器”里
  2. 右键“源文件”
  3. 选择 添加 → 新建项
  4. 选择 C++ 文件(.cpp)
  5. 命名为:main.cpp
  6. 把上面的代码粘贴进去

接着检查字符集:

因为代码里用了 L"中文" 这种宽字符,建议:

  • 打开项目属性
  • 找到 高级
  • 字符集 设置为 使用 Unicode 字符集

这样更适合 Windows API 编程。


方法二:直接创建 Windows 桌面应用模板

如果你不想从空项目开始,也可以直接建 Windows 桌面程序项目。

操作步骤:

  1. 创建新项目
  2. 搜索:Windows 桌面向导
  3. 选择 Windows 桌面向导
  4. 下一步
  5. 选择:
    • 应用程序类型:Windows 应用程序
    • 勾选:空项目
  6. 创建后再添加 .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:窗口被关闭
  • 其他消息:交给系统默认处理

七、如何编译并运行

操作步骤:

  1. 在 Visual Studio 顶部选择:
    • 配置:Debug
    • 平台:x64Win32
  2. 点击 生成 → 生成解决方案
  3. 如果没有错误,点击 调试 → 开始执行(不调试)
  4. 程序会弹出一个窗口

如果一切正常,你会看到一个标题为:

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 程序都不会,后面会更乱。

建议顺序是:

  1. 先学 Win32 API 基础
  2. 再学消息机制
  3. 再学控件
  4. 再考虑 MFC / Qt / 现代界面框架

2. 不要混用控制台程序和窗口程序写法

控制台程序入口是:

int main()

窗口程序入口是:

int WINAPI WinMain(...)

这两个不是一回事。
如果你工程是窗口程序,却写 main(),可能会出各种问题。


3. 不要乱改字符集

Windows API 有宽字符和窄字符两套接口,新手很容易混乱。
最稳妥的办法是:

  • 直接用 Unicode
  • 代码里统一使用 L"字符串"
  • 尽量别混 char*wchar_t*

4. 不要忽略返回值

像这些函数都可能失败:

  • RegisterClass
  • CreateWindowEx
  • LoadCursor
  • BeginPaint

新手写示例时,最好都加上判断。
不然程序闪退了,你很难知道是哪一步出错。


十二、如果你想继续深入,可以学这些内容

当你已经能写出一个基础窗口程序后,下一步建议往下面几个方向走:

1. 消息机制

理解:

  • WM_CREATE
  • WM_PAINT
  • WM_COMMAND
  • WM_DESTROY
  • WM_KEYDOWN
  • WM_LBUTTONDOWN

2. 常用控件

学习:

  • 按钮
  • 编辑框
  • 列表框
  • 下拉框
  • 复选框

3. 文件操作

学习怎么:

  • 读写文本
  • 保存配置
  • 打开文件对话框

4. 绘图

学习:

  • 画线
  • 画矩形
  • 显示图片
  • 双缓冲防闪烁

5. 多线程

学习:

  • 后台任务
  • 窗口不卡顿
  • 线程同步

这些内容学完,你就不只是会写“示例程序”,而是真的开始具备 Windows 编程基础了。


十三、总结

如果你问 VC怎么编写Windows示例程序,最核心的答案其实就是:

  1. 安装好 Visual Studio C++ 桌面开发环境
  2. 新建一个空项目
  3. 编写 WinMain 作为入口
  4. 注册窗口类
  5. 创建窗口
  6. 进入消息循环
  7. WindowProc 里处理消息
  8. 通过 WM_PAINTWM_COMMAND 等消息实现界面和交互

对新手来说,最重要的不是一下子把所有 API 都背下来,而是先把窗口能创建出来、能显示文字、能响应按钮这几个最基本的步骤跑通。
只要这一关过了,后面学按钮、菜单、对话框、文件操作、绘图,就会顺很多。

掌握了这个最基础的 Windows 示例程序,你就已经迈进了 VC/Win32 编程的大门。

文章版权声明:文章内容均来源于各大短视频平台搜集以及修改和删减新增,如有侵权或者违规,请联系站长进行删除,如需转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
验证码
评论列表 (暂无评论,3人围观)

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

目录[+]