Win32 应用程序开发终极指南

这份教程将分为以下几个部分:

win32 application教程
(图片来源网络,侵删)
  1. 什么是 Win32 应用? - 理解基础概念
  2. 开发环境准备 - 搭建你的工具链
  3. 第一个程序:Hello, Window! - 经典入门
  4. 深入核心概念 - 消息、窗口过程、事件驱动
  5. 实战:一个简单的记事本 - 综合运用所学
  6. 进阶与资源 - 学习更高级的主题
  7. 总结与推荐 - 继续学习的路径

什么是 Win32 应用?

Win32 应用是使用 Microsoft 提供的 Win32 API (Application Programming Interface) 开发的原生 Windows 桌面应用程序。

  • 原生:意味着它不依赖于 .NET Framework、Java 虚拟机等运行时,它直接与 Windows 操作系统内核交互,因此启动速度快、资源占用低、性能高。
  • API:可以理解为操作系统提供的一本“说明书”或一个“工具箱”,你的程序通过调用这些 API 函数,来请求操作系统完成各种任务,创建窗口、显示对话框、读写文件、管理内存等。
  • 历史:Win32 API 最初是为 32 位 Windows 系统设计的,但其核心思想至今仍在 64 位 Windows 系统中沿用,我们现在通常所说的 Win32 API 开发,指的是使用 C 语言风格(C-style)的 API 来调用系统功能。

与其它技术的对比:

技术 描述 优点 缺点
Win32 API (C/C++) 直接调用系统 API,最底层、最原生。 性能最高、完全控制、体积小。 开发复杂、繁琐、需要手动管理内存和UI。
MFC (C++) Microsoft 对 Win32 API 的 C++ 封装。 面向对象、简化了部分开发。 学习曲线陡峭、代码风格老旧、已非主流。
.NET (C#/VB.NET) 运行在 .NET 运行时之上。 开发效率高、内存管理自动(GC)、库丰富。 依赖运行时、性能略逊于原生、启动有延迟。
Qt/ wxWidgets (C++) 跨平台的 GUI 框架。 一次编写,多平台运行、库强大。 引入第三方依赖、学习框架本身需要时间。

本教程将聚焦于最原始、最核心的 Win32 API C 语言风格开发。


开发环境准备

你需要一个 C/C++ 编译器和一个代码编辑器/IDE。

win32 application教程
(图片来源网络,侵删)

Visual Studio (推荐,最简单)

  1. 下载安装:访问 Visual Studio 官网
  2. 选择版本:下载 "Visual Studio Community" (社区版),它是免费的,功能足够强大。
  3. 安装工作负载:在安装程序中,务必勾选 “使用 C++ 的桌面开发” 工作负载,这个选项会自动安装 C++ 编译器、Windows SDK 和一些必要的工具。

安装完成后,你就可以使用 Visual Studio 来创建和编译 Win32 程序了。

MinGW-w64 + VS Code (轻量级,跨平台)

  1. 安装编译器:下载并安装 MSYS2,MSYS2 是一个强大的软件环境和构建平台,它提供了 MinGW-w64 编译器,可以在 Windows 上生成原生的 Windows 程序。

    • 安装 MSYS2 后,打开 MSYS2 MINGW64 终端。
    • 执行以下命令更新系统并安装编译器工具链:
      pacman -Syu
      pacman -S --needed base-devel mingw-w64-x86_64-toolchain
  2. 安装代码编辑器:下载并安装 Visual Studio Code

  3. 配置 VS Code

    win32 application教程
    (图片来源网络,侵删)
    • 安装 C/C++ 扩展(由 Microsoft 发布)。
    • 安装 Code Runner 扩展(可以一键编译运行代码)。
    • 在 VS Code 中配置编译器路径,使其能找到 g++.exe

第一个程序:Hello, Window!

这是每个 Windows 程序员的“Hello, World!”,它不会在窗口里打印文字,而是创建一个标准的、可操作的空白窗口,这是学习 Win32 API 最重要的一步。

步骤 1:创建项目 (以 Visual Studio 为例)

  1. 打开 Visual Studio。
  2. 选择 “创建新项目”。
  3. 搜索并选择 “Windows 桌面应用程序” 模板(确保语言是 C++)。
  4. 给项目起个名字,HelloWindow,然后点击创建。
  5. VS 会自动生成一些代码,我们暂时忽略它们,自己从头开始写。

步骤 2:编写代码

将下面这段代码完整地复制并粘贴到你的 HelloWindow.cpp 文件中,删除原有内容。

// HelloWindow.cpp
#include <windows.h> // 包含所有 Windows API 的头文件
// 1. 窗口过程函数 - 这是窗口的“大脑”,负责处理所有发给窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY: // 当用户点击窗口的 'X' 按钮时,会收到这个消息
        PostQuitMessage(0); // 发送一个退出消息给程序
        return 0;
    case WM_PAINT: // 当窗口需要重绘时(如首次显示、被遮挡后重现),会收到这个消息
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        // 在这里进行绘制操作
        FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); // 用默认背景色填充窗口
        EndPaint(hwnd, &ps);
        return 0;
    }
    }
    // 如果我们没有处理某个消息,就交给系统默认处理
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
// 2. WinMain 函数 - 程序的入口点,相当于控制台程序的 main 函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // 注册窗口类
    const wchar_t CLASS_NAME[] = L"Sample Window Class";
    WNDCLASS wc = { };
    wc.lpfnWndProc = WindowProc;      // 指向我们的窗口过程函数
    wc.hInstance = hInstance;         // 当前实例句柄
    wc.lpszClassName = CLASS_NAME;    // 窗口类的名称
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 设置鼠标光标
    // 注册窗口类
    RegisterClass(&wc);
    // 创建窗口
    HWND hwnd = CreateWindowEx(
        0,                      // 可选的窗口风格
        CLASS_NAME,             // 窗口类名
        L"Hello, Window!",      // 窗口标题
        WS_OVERLAPPEDWINDOW,    // 窗口风格
        // 窗口位置和大小
        CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
        NULL,       // 父窗口句柄
        NULL,       // 菜单句柄
        hInstance,  // 实例句柄
        NULL        // 额外的创建参数
    );
    if (hwnd == NULL)
    {
        return 0;
    }
    // 显示窗口
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    // 3. 消息循环 - 程序的心跳,持续运行直到收到退出消息
    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg); // 翻译键盘消息
        DispatchMessage(&msg);  // 将消息发送给窗口过程函数处理
    }
    return 0; // 当 GetMessage 返回 0 时,程序退出
}

步骤 3:编译和运行

  • 在 Visual Studio 中:直接按 F5 或点击“开始调试”按钮。
  • 在 VS Code + MinGW 中:打开终端,到源码目录,运行 g++ HelloWindow.cpp -o HelloWindow.exe -mwindows,然后运行 .\HelloWindow.exe

你应该能看到一个标准的 Windows 窗口被创建