C++实现一个可视化Windows窗口程序

#include 
#include 
#include "main.h"


// 窗口过程回调函数,用于处理窗口消息

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
        case WM_DESTROY:

            //来发送一个退出消息到应用程序的消

            PostQuitMessage(0); // 当窗口关闭时,发送退出消息

            break;

        case WM_SIZE: {
            int width = LOWORD(lParam);
            int height = HIWORD(lParam);

            // 背景处理
            {
                //绘图相关的信息
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hwnd, &ps);
                // 绘制背景色
                RECT rect;
                // 窗口尺寸
                //获取窗口的客户区域(不包括标题栏和边框)的坐标和大小,并将其存储在 rect 结构体中。
                GetClientRect(hwnd, &rect);
                //创建了一个白色的实心画刷。
                HBRUSH hBrush = CreateSolidBrush(RGB(255, 255, 255));
               // FillRect 函数用于使用指定的画刷填充指定的矩形区域,这里将客户区域(&rect)以白色画刷填充。
                FillRect(hdc, &rect, hBrush);
                //通知系统绘图已经完成,清理绘图环境并更新窗口。
                EndPaint(hwnd, &ps);
            }

            // 控件处理
            {

            }
        }
            break;

        default:

            return DefWindowProc(hwnd, message, wParam, lParam); // 处理默认消息

    }

    return 0;

}


void MsgLoop() {
    // 4. 消息循环
    MSG msg;
    //这个消息循环会持续运行,不断从消息队列中获取消息,将其翻译和分派给窗口过程函数,直到接收到退出消息
    while (GetMessage(&msg, NULL, 0, 0)) {
        //这个函数用于翻译某些特殊键盘消息,例如按下和释放键盘键的消息
        TranslateMessage(&msg);
        //数用于分派消息给窗口过程WndProc函数
        DispatchMessage(&msg);
    }
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    // 1. 注册窗口类

    WNDCLASSEX wc = {sizeof(WNDCLASSEX)};

    wc.lpfnWndProc = WndProc;           // 设置窗口过程函数

    wc.hInstance = hInstance;           // 应用程序实例句柄

    wc.lpszClassName = "MyWindowClass"; // 窗口类名称

    //这一行将鼠标光标的句柄分配给 wc 结构体的 hCursor 成员。

    wc.hCursor = LoadCursor(NULL, IDC_ARROW);//用于加载一个标准箭头光标。这是窗口的默认光标。

//使用 RegisterClassEx 函数来注册窗口类。如果注册失败,它返回一个错误代码。如果注册成功,它返回非零值。

    if (!RegisterClassEx(&wc)) {
        MessageBoxW(NULL, L"Windows register error!", L"error", MB_ICONERROR);

        return -1;

    }

    // 2. 创建窗口

    HWND hwnd = CreateWindowW(
            L"MyWindowClass",       // 窗口类名称
            L"Test", // 窗口标题
            WS_OVERLAPPEDWINDOW,   // 窗口样式
            CW_USEDEFAULT,         // 窗口的X坐标
            CW_USEDEFAULT,         // 窗口的Y坐标
            400,                   // 窗口的宽度
            300,                   // 窗口的高度
            NULL,                  // 父窗口句柄
            NULL,                  // 菜单句柄
            hInstance,             // 应用程序实例句柄
            NULL                   // 附加参数
    );
// 创建一个 Group Box 容器
    HWND groupBox = CreateWindowW(
            L"BUTTON",          // 类名
            L"Group Box",       // 标题
            WS_CHILD | WS_VISIBLE | BS_GROUPBOX, // 样式,表示这是一个子控件、可见,并且是 Group Box
            100,                 // X 坐标
            10,                 // Y 坐标
            200,                // 宽度
            200,                // 高度
            hwnd,               // 父窗口句柄
            NULL,               // 菜单句柄
            hInstance,          // 应用程序实例句柄
            NULL                // 附加参数
    );

// 在 Group Box 容器中添加一个按钮
    HWND buttonInGroupBox = CreateWindowW(
            L"BUTTON",          // 类名
            L"Button in Group Box", // 按钮文本
            WS_CHILD | WS_VISIBLE, // 样式,表示这是一个子控件并且可见
            20,                 // 相对于 Group Box 的 X 坐标
            30,                 // 相对于 Group Box 的 Y 坐标
            150,                // 宽度
            30,                 // 高度
            groupBox,           // Group Box 容器的句柄,将按钮作为 Group Box 的子控件
            NULL,               // 菜单句柄
            hInstance,          // 应用程序实例句柄
            NULL                // 附加参数
    );

    if (!hwnd) {
        MessageBoxW(NULL, L"Windows creat error!", L"error", MB_ICONERROR);
        return -1;
    }

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

    //强制窗口重新绘制,以确保它立即可见。
    UpdateWindow(hwnd);

    // 创建一个按钮
    HWND button = CreateWindowW(
            L"BUTTON",          // 类名
            L"Click Me",        // 按钮文本
            WS_CHILD | WS_VISIBLE, // 样式,表示这是一个子控件并且可见
            150,                // X 坐标
            100,                // Y 坐标
            100,                // 宽度
            30,                 // 高度
            hwnd,               // 父窗口句柄
            NULL,               // 菜单句柄
            hInstance,          // 应用程序实例句柄
            NULL                // 附加参数
    );

    // 创建一个相对位置的按钮
    HWND button2 = CreateWindowW(
            L"BUTTON",          // 类名
            L"Click Me2",        // 按钮文本
            WS_CHILD | WS_VISIBLE, // 样式,表示这是一个子控件并且可见
            80,                 // 相对于窗口的 X 坐标
            50,                 // 相对于窗口的 Y 坐标
            100,                // 宽度
            30,                 // 高度
            hwnd,               // 父窗口句柄
            (HMENU)button, // 控件标识符,用于在 WM_COMMAND 中识别控件
            hInstance,          // 应用程序实例句柄
            NULL                // 附加参数
    );
    MsgLoop();

    return 0;
}




你可能感兴趣的:(c++)