windows编程: 使用win32 api 进行界面开发简单示例

551 阅读2分钟

前言

在windows编程中,界面开发的框架有很多.例如qt,win32,mfc,wpf,uwp,WinForms,Avalonia等. 比较推荐的是QT,与win32. win32 非常灵活,性能最好.但开发复杂的GUI非常困难,QT支持跨平台,其他的不是很建议.

开发基本思路

使用Win32 API 进行界面开发时,一般的步骤是:

  1. 创建窗口类
  2. 注册窗口类
  3. 创建窗口
  4. 显示窗口
  5. 消息循环事件触发与监听.

代码示例

我们想要创建窗口,可以使用系统已有的窗口类,也可以自定义创建窗口类.

WNDCLASS wc = {0};
wc.lpfnWndProc = WindowProc; // 窗口消息函数
wc.hInstance = hInstance; // 实例句柄
wc.lpszClassName = "SampleWindowClass"; // 窗口类名
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 自定义光标
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 自定义图标
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); // 背景画刷
wc.lpszMenuName = NULL; // 没有菜单
wc.style = CS_HREDRAW | CS_VREDRAW; // 窗口样式

然后需要对该窗口类进行注册.(不同进程注册的窗口类是相互隔离的,只有系统的窗口类是公共的)

RegisterClass(&wc);

接着就是创建窗口

    // 创建窗口
    HWND hwnd = CreateWindowEx(
        0, // 扩展样式
        wc.lpszClassName, // 窗口类名
        "Hello, Win32!", // 窗口标题
        WS_OVERLAPPEDWINDOW, // 窗口样式
        CW_USEDEFAULT, CW_USEDEFAULT, // 位置
        500, 400, // 尺寸
        NULL, // 父窗口
        NULL, // 菜单
        hInstance, // 实例句柄
        NULL // 附加参数
    );

显示窗口

    // 显示窗口
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

编写消息循环

    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

消息循环会发送窗口消息到WindowProc 这个我们定义的函数中.该函数需要如下定义(入参与出参都是固定的):

// 窗口过程函数实现
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);
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); // 填充背景
            EndPaint(hwnd, &ps);
        } return 0;
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam); // 默认处理
}

这样我们就可以根据窗口的消息,来进行对应消息的处理.

Win32 API 窗口的应用,一般是作为逆向的窗口程序编写.例如注册机等