c++不使用MessageBox弹出弹窗,绘制图形

发布于:2025-02-18 ⋅ 阅读:(177) ⋅ 点赞:(0)

WinAPI创建窗口。步骤包括注册窗口类、创建窗口实例、显示窗口,并处理消息循环。可能需要编写窗口过程函数来处理消息,比如WM_PAINT来绘制窗口内容,WM_CLOSE来处理关闭事件。

在 C++ 中如果不使用 MessageBox 创建弹窗,可以使用 Windows API 直接创建自定义窗口。以下是使用纯 Win32 API 创建简单弹窗的示例:

#include <windows.h>
#include <gdiplus.h>
// 声明全局字符串
const wchar_t* g_text = L"这是窗口内的文字输出!";
// 创建自定义字体

// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_PAINT:  // 窗口需要绘制时触发
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);  // 获取设备上下文
        // 设置文字颜色为蓝色
        SetTextColor(hdc, RGB(0, 0, 100));
        // 设置背景模式为透明
        SetBkMode(hdc, TRANSPARENT);
        
        // 输出文字(位置:x=50, y=50)
        TextOutW(hdc, 50, 50, g_text, wcslen(g_text));
        
		// 虚线画笔示例
		HPEN hDashPen = CreatePen(PS_DASH, 1, RGB(128, 128, 128));
		SelectObject(hdc, hDashPen);
		LineTo(hdc, 400, 400);
		DeleteObject(hDashPen);

		// 其他可用样式:
		// PS_SOLID   实线
		// PS_DOT     点线
		// PS_DASHDOT 点划线
        return 0;
    }
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pCmdLine, int nCmdShow)
{
    const char* CLASS_NAME = "CustomWindowClass";
    
    WNDCLASS wc = {};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = TEXT(CLASS_NAME);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    
    if (!RegisterClass(&wc)) return 0;

    // 创建窗口
    HWND hwnd = CreateWindowEx(
        0,                              // 扩展样式
        TEXT(CLASS_NAME),                     // 窗口类
        "自定义弹窗",                   // 窗口标题
        WS_OVERLAPPEDWINDOW | WS_VISIBLE, // 窗口样式
        CW_USEDEFAULT, CW_USEDEFAULT,   // 位置
        300, 200,                       // 大小
        NULL,                           // 父窗口
        NULL,                           // 菜单
        hInstance,                      // 实例句柄
        NULL                            // 附加数据
    );

    if (!hwnd) return 0;

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

    return 0;
}

关键点说明:

        窗口类注册:通过 WNDCLASS 定义窗口属性

        窗口创建:使用 CreateWindowEx 创建实际窗口

        消息循环:处理系统消息的循环结构

        窗口过程:WindowProc 处理窗口消息(关闭、绘制等)

如果要创建更复杂的弹窗,可以:

        添加按钮控件 (CreateWindow 使用 BUTTON 类)

        自定义绘制 (处理 WM_PAINT 消息)

        添加图标资源

        设置自定义窗口样式

注意事项:

        需要链接 user32.lib 和 gdi32.lib

        这是最底层的 Windows API 实现

        如果使用其他框架(Qt/WxWidgets)会有更简单的实现方式

        建议使用现代 GUI 框架的场景:

        需要复杂界面时 - 推荐 Qt

        需要快速开发时 - 推荐 ImGui

        需要跨平台支持时 - 推荐 wxWidgets

这种底层实现方式虽然灵活,但需要处理大量窗口消息和资源管理,建议仅在需要完全控制窗口行为时使用。


网站公告

今日签到

点亮在社区的每一天
去签到