制作多样式桌面弹窗MessageBox详细用法

MessageBox 是 Windows API 中的一个函数,用于显示一个模态对话框,该对话框包含一个系统图标、一组按钮和一条简短的特定消息。其函数原型如下:

int MessageBox(

  HWND    hWnd,

  LPCTSTR lpText,

  LPCTSTR lpCaption,

  UINT    uType

);

各参数详细含义

1. HWND hWnd

含义:指定消息框的父窗口句柄。如果此参数为 NULL,则消息框没有父窗口。

效果及示例:

当 hWnd 为 NULL 时,消息框会独立于任何窗口显示。例如:

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    MessageBox(NULL, "这是一条消息", "消息标题", MB_OK);

    return 0;

}

当指定一个有效的窗口句柄时,消息框会与该窗口关联,并且会在该窗口的上方居中显示。例如,在一个窗口过程函数中调用 MessageBox:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    static TCHAR szAppName[] = TEXT("HelloWin");

    HWND hwnd;

    MSG msg;

    WNDCLASS wndclass;



    wndclass.style = CS_HREDRAW | CS_VREDRAW;

    wndclass.lpfnWndProc = WndProc;

    wndclass.cbClsExtra = 0;

    wndclass.cbWndExtra = 0;

    wndclass.hInstance = hInstance;

    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

    wndclass.lpszMenuName = NULL;

    wndclass.lpszClassName = szAppName;



    if (!RegisterClass(&wndclass))

    {

        MessageBox(NULL, TEXT("This program requires Windows NT!"),

            szAppName, MB_ICONERROR);

        return 0;

    }



    hwnd = CreateWindow(szAppName, TEXT("The Hello Program"),

        WS_OVERLAPPEDWINDOW,

        CW_USEDEFAULT, CW_USEDEFAULT,

        CW_USEDEFAULT, CW_USEDEFAULT,

        NULL, NULL, hInstance, NULL);



    ShowWindow(hwnd, iCmdShow);

    UpdateWindow(hwnd);



    while (GetMessage(&msg, NULL, 0, 0))

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

    return msg.wParam;

}



LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    switch (message)

    {

    case WM_LBUTTONDOWN:

        MessageBox(hwnd, "你点击了鼠标左键", "提示", MB_OK);

        return 0;

    case WM_DESTROY:

        PostQuitMessage(0);

        return 0;

    default:

        return DefWindowProc(hwnd, message, wParam, lParam);

    }

}

在这个例子中,当用户点击窗口的客户区时,会弹出一个与该窗口关联的消息框。

2. LPCTSTR lpText

含义:指定要在消息框中显示的文本内容。

效果及示例:

可以是任意字符串,用于向用户传达信息。例如:

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    MessageBox(NULL, "操作成功,请继续下一步。", "操作结果", MB_OK);

    return 0;

}

3. LPCTSTR lpCaption

含义:指定消息框的标题文本。

效果及示例:

显示在消息框的标题栏上。例如:

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    MessageBox(NULL, "请确认是否删除该文件。", "文件删除确认", MB_YESNO);

    return 0;

}

4. UINT uType

含义:指定消息框的样式,它是一个位掩码,可以组合不同的标志来控制消息框的外观和行为。

常见标志及效果示例:

按钮样式:

MB_OK:显示一个 “确定” 按钮。

图标样式

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    MessageBox(NULL, "这是一个简单的提示消息。", "提示", MB_OK);

    return 0;

}

MB_YESNO:显示 “是” 和 “否” 按钮。

cpp

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    int result = MessageBox(NULL, "是否保存更改?", "保存提示", MB_YESNO);

    if (result == IDYES)

    {

        MessageBox(NULL, "你选择了保存。", "结果", MB_OK);

    }

    else if (result == IDNO)

    {

        MessageBox(NULL, "你选择了不保存。", "结果", MB_OK);

    }

    return 0;

}

图标样式:

MB_ICONINFORMATION:显示一个信息图标(蓝色的小写字母 i 在圆圈中)。

cpp

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    MessageBox(NULL, "软件更新已完成。", "更新提示", MB_OK | MB_ICONINFORMATION);

    return 0;

}

MB_ICONWARNING:显示一个警告图标(黄色的感叹号)。

cpp

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    MessageBox(NULL, "磁盘空间不足,请及时清理。", "警告", MB_OK | MB_ICONWARNING);

    return 0;

}

MB_ICONERROR:显示一个错误图标(红色的叉号)。

cpp

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    MessageBox(NULL, "文件读取失败,请检查文件路径。", "错误", MB_OK | MB_ICONERROR);

    return 0;

}

这些组合

可以根据具体需求灵活调整,以实现不同风格和功能的消息框。

UINT uType 的样式有哪些,列出来全部的

UINT uType 参数用于指定消息框的样式,它是一个位掩码,可以通过组合不同的标志来控制消息框的外观、按钮和图标等。以下是 uType 可用的主要样式标志:

按钮样式标志

标志  描述

MB_OK   显示一个 “确定” 按钮,这是默认的按钮样式。

MB_OKCANCEL 显示 “确定” 和 “取消” 按钮。

MB_ABORTRETRYIGNORE 显示 “中止”、“重试” 和 “忽略” 按钮。

MB_YESNOCANCEL  显示 “是”、“否” 和 “取消” 按钮。

MB_YESNO    显示 “是” 和 “否” 按钮。

MB_RETRYCANCEL  显示 “重试” 和 “取消” 按钮。

图标样式标志

标志  描述

MB_ICONHAND

MB_ICONSTOP

MB_ICONERROR    显示一个红色的叉号图标,表示错误。这三个标志是等价的。

MB_ICONQUESTION 显示一个问号图标,不过这种图标在现代应用中较少使用,因为它可能会让用户产生困惑。

MB_ICONEXCLAMATION

MB_ICONWARNING  显示一个黄色的感叹号图标,表示警告。这两个标志是等价的。

MB_ICONASTERISK

MB_ICONINFORMATION  显示一个蓝色的小写字母 i 在圆圈中的图标,表示信息。这两个标志是等价的。

默认按钮标志

标志  描述

MB_DEFBUTTON1   将第一个按钮设为默认按钮(通常是 “确定” 或 “是” 按钮),这是默认设置。

MB_DEFBUTTON2   将第二个按钮设为默认按钮。

MB_DEFBUTTON3   将第三个按钮设为默认按钮。

MB_DEFBUTTON4   将第四个按钮设为默认按钮。

模态性标志

标志  描述

MB_APPLMODAL    应用程序模态。在用户响应消息框之前,用户不能与同一应用程序中的其他窗口交互。这是默认的模态性设置。

MB_SYSTEMMODAL  系统模态。在用户响应消息框之前,用户不能与系统中的其他窗口交互。通常用于需要立即关注的系统级消息。

MB_TASKMODAL    任务模态。在用户响应消息框之前,用户不能与当前任务中的其他窗口交互。

其他标志

标志  描述

MB_HELP 在消息框中显示一个 “帮助” 按钮。点击该按钮会向父窗口发送 WM_HELP 消息。

MB_NOFOCUS  消息框不获取输入焦点,即用户可以在消息框显示时与其他窗口交互。

MB_SETFOREGROUND    消息框被强制置于前台,即使创建它的线程没有前台权限。

MB_TOPMOST  消息框具有最高的 z 顺序,始终显示在其他窗口之上。

MB_RIGHT    文本右对齐。

MB_RTLREADING   按照从右到左的阅读顺序显示文本,适用于支持从右到左书写的语言。

MB_SERVICE_NOTIFICATION 用于服务程序显示消息框。如果桌面没有交互式用户,则消息框会显示在安全桌面的服务消息框会话中。

这些标志可以通过按位或(|)运算符组合使用,以创建具有不同特性的消息框。例如:

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    MessageBox(NULL, "是否保存更改?", "保存提示", MB_YESNO | MB_ICONQUESTION | MB_DEFBUTTON2);

    return 0;

}

这个例子创建了一个带有 “是” 和 “否” 按钮、问号图标,并且将 “否” 按钮设为默认按钮的消息框。

关于 MessageBox 函数的详细操作和注意事项:

详细操作

1. 处理返回值

MessageBox 函数会返回一个整数值,该值表示用户点击了哪个按钮。你可以根据返回值来执行不同的操作。以下是常见返回值及其对应的按钮:

返回值 对应按钮

IDOK    点击了 “确定” 按钮

IDCANCEL    点击了 “取消” 按钮

IDABORT 点击了 “中止” 按钮

IDRETRY 点击了 “重试” 按钮

IDIGNORE    点击了 “忽略” 按钮

IDYES   点击了 “是” 按钮

IDNO    点击了 “否” 按钮

示例代码:

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    int result = MessageBox(NULL, "是否保存更改?", "保存提示", MB_YESNO);

    switch (result)

    {

    case IDYES:

        MessageBox(NULL, "你选择了保存更改。", "结果", MB_OK);

        break;

    case IDNO:

        MessageBox(NULL, "你选择了不保存更改。", "结果", MB_OK);

        break;

    default:

        break;

    }

    return 0;

}

2. 组合样式标志

可以使用按位或(|)运算符将不同的样式标志组合起来,以创建具有多种特性的消息框。例如,同时设置按钮样式、图标样式和默认按钮:

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    MessageBox(NULL, "磁盘空间不足,请及时清理。", "警告", MB_OK | MB_ICONWARNING | MB_DEFBUTTON1);

    return 0;

}

3. 处理不同字符编码

在 Windows 编程中,有两种字符编码方式:ANSI 和 Unicode。如果使用 Unicode 版本的 MessageBox(即 MessageBoxW),需要使用宽字符字符串(以 L 前缀开头)。如果使用 ANSI 版本的 MessageBox(即 MessageBoxA),则使用普通的多字节字符串。建议使用 Unicode 版本以支持更广泛的字符集。

示例代码(Unicode 版本):

#include <windows.h>



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

    MessageBoxW(NULL, L"这是一个 Unicode 消息框。", L"标题", MB_OK);

    return 0;

}

注意事项

1. 资源管理

MessageBox 是一个模态对话框,在用户关闭消息框之前,程序会暂停执行。因此,在调用 MessageBox 时,要确保不会导致资源泄漏或程序逻辑出现问题。例如,如果在消息框显示期间有未释放的资源,可能会影响程序的稳定性。

2. 国际化和本地化

如果你的程序需要支持多种语言,应该使用字符串资源来存储消息框的文本内容,而不是硬编码字符串。这样可以方便地进行本地化,通过修改资源文件来适应不同的语言环境。

3. 性能考虑

频繁调用 MessageBox 可能会影响用户体验,尤其是在循环中使用时。尽量避免不必要的消息框弹出,或者考虑使用其他方式(如日志记录)来提供信息。

4. 安全性

不要在消息框中显示敏感信息,如用户密码、密钥等。同时,要注意防范用户输入的恶意内容,避免在消息框中显示未经过滤的用户输入,以防跨站脚本攻击(XSS)等安全问题。

5. 兼容性

虽然 MessageBox 是 Windows API 中常用的函数,但在不同的 Windows 版本中可能会有细微的差异。在开发跨版本的应用程序时,要进行充分的测试,确保消息框在各种环境下都能正常显示和工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LAOLONG-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值