一、项目背景详细介绍

在 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 / 高分辨率适配

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐