Skip to content

消息对话框

消息对话框也就是常用的MesageBox

在win32中有一个MesageBox的原始版本

在MFC中,有MFC自定义封装的MesageBox,也有额外的AfxMesageBox

Win32 MessageBox

在MFC中,很多函数对win32中的原版进行了升级封装

若要使用win32原版本的函数,需要在函数前加上::操作符,以使用全局作用域的变量

c++
void CMainDlg::OnBnClickedButton1()
{
	::MessageBox(NULL ,L"内容", L"标题", NULL);
}

效果如下

image-20250619195037276

win32中很多函数都有两个版本

  • 一个是xxxxW,用于参数包含字符串时,徐传入宽字符,也就是L"xxx"
  • 一个是xxxxA,用于参数包含字符串时,徐传入正常字符,也就是"xxx"

函数定义

c++
#ifdef UNICODE
#define MessageBox  MessageBoxW
#else
#define MessageBox  MessageBoxA


WINUSERAPI int WINAPI MessageBoxA(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCSTR lpText,
    _In_opt_ LPCSTR lpCaption,
    _In_ UINT uType);

WINUSERAPI int WINAPI MessageBoxW(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCWSTR lpText,
    _In_opt_ LPCWSTR lpCaption,
    _In_ UINT uType);

这两个函数分别使用宏定义重新定义了一遍,使用条件编译,判断当前环境的字符类型是否为UNICODE

参数

  • hWnd:指示该消息框属于哪个窗口

    • 若为NULL,则当次消息框没关闭时,可以操作其隶属窗口
    • 若不为NULL,则当次消息框没关闭时,不可以操作其隶属窗口
  • lpText:消息框的文字内容

  • lpCaption:消息框的标题

  • uType:消息框的类型,下面详细说明,多个值可用|操作符连接,如MB_YESNOCANCEL|MB_ICONHAND

若要指示消息框中显示的按钮,请指定以下值之一。

含义
MB_ABORTRETRYIGNORE
0x00000002L
消息框包含三个按钮: “中止”、“ **重试”**和 “忽略”。
MB_CANCELTRYCONTINUE
0x00000006L
消息框包含三个按钮: 取消重试继续。 使用此消息框类型而不是MB_ABORTRETRYIGNORE。
MB_HELP
0x00004000L
向消息框添加 “帮助 ”按钮。 当用户单击“ 帮助 ”按钮或按 F1 时,系统会向所有者发送 WM_HELP 消息。
MB_OK
0x00000000L
消息框包含一个按钮: “确定”。 这是默认值。
MB_OKCANCEL
0x00000001L
消息框包含两个按钮: “确定”“取消”。
MB_RETRYCANCEL
0x00000005L
消息框包含两个按钮: 重试取消
MB_YESNO
0x00000004L
消息框包含两个按钮: “是 ”和“ ”。
MB_YESNOCANCEL
0x00000003L
消息框包含三个按钮: “是”、“ **否”**和 “取消”。

若要在消息框中显示图标,请指定以下值之一。

含义
**MB_ICONEXCLAMATION
**0x00000030L
消息框中会显示一个感叹号图标。
MB_ICONWARNING
0x00000030L
消息框中会显示一个感叹号图标。
MB_ICONINFORMATION
0x00000040L
消息框中将显示一个由圆圈中的小写字母 i 组成的图标。
MB_ICONASTERISK
0x00000040L
消息框中将显示一个由圆圈中的小写字母 i 组成的图标。
MB_ICONQUESTION
0x00000020L
消息框中会显示一个问号图标。 不再建议使用问号消息图标,因为这种图标无法清楚地表示特定类型的消息,并且作为问题的消息表述可应用于任何消息类型。 此外,用户可能会将问号消息符号与帮助信息混淆。 因此,不要在消息框中使用问号消息符号。 系统继续支持它包含的内容,只为满足反向兼容性。
MB_ICONSTOP
0x00000010L
消息框中会显示一个停止符号图标。
MB_ICONERROR
0x00000010L
消息框中会显示一个停止符号图标。
MB_ICONHAND
0x00000010L
消息框中会显示一个停止符号图标。

若要指示默认按钮,请指定以下值之一。

含义
MB_DEFBUTTON1
0x00000000L
第一个按钮是默认按钮。除非 指定了 MB_DEFBUTTON2MB_DEFBUTTON3或MB_DEFBUTTON4,否则 MB_DEFBUTTON1 为默认值。
MB_DEFBUTTON2
0x00000100L
第二个按钮是默认按钮。
MB_DEFBUTTON3
0x00000200L
第三个按钮是默认按钮。
MB_DEFBUTTON4
0x00000300L
第四个按钮是默认按钮。

若要指示对话框的形式,请指定以下值之一。

含义
MB_APPLMODAL
0x00000000L
用户必须先响应消息框,然后才能在 由 hWnd 参数标识的窗口中继续工作。 但是,用户可以移动到其他线程的窗口,并在这些窗口中工作。根据应用程序中窗口的层次结构,用户可能能够移动到线程中的其他窗口。 将自动禁用消息框父级的所有子窗口,但弹出窗口不会禁用。如果未指定MB_SYSTEMMODALMB_TASKMODAL,则MB_APPLMODAL为默认值。
MB_SYSTEMMODAL
0x00001000L
与MB_APPLMODAL相同,只是消息框具有 WS_EX_TOPMOST 样式。 使用系统模式消息框通知用户严重、潜在的破坏性错误,这些错误需要立即关注 (例如内存不足) 。 除了与 hWnd 关联的窗口之外,此标志不会影响用户与窗口交互的能力。
MB_TASKMODAL
0x00002000L
MB_APPLMODAL相同, 但如果 hWnd 参数为 NULL,则禁用属于当前线程的所有顶级窗口。 当调用应用程序或库没有可用的窗口句柄,但仍需要阻止输入调用线程中的其他窗口而不挂起其他线程时,请使用此标志。

若要指定其他选项,请使用以下一个或多个值。

含义
MB_DEFAULT_DESKTOP_ONLY
0x00020000L
与交互式窗口工作站的桌面相同。 有关详细信息,请参阅 窗口工作站。如果当前输入桌面不是默认桌面,则在用户切换到默认桌面之前 ,MessageBox 不会返回。
MB_RIGHT
0x00080000L
文本右对齐。
MB_RTLREADING
0x00100000L
在希伯来语和阿拉伯语系统上使用从右到左的阅读顺序显示消息和描述文字文本。
MB_SETFOREGROUND
0x00010000L
消息框将成为前台窗口。 在内部,系统为消息框调用 SetForegroundWindow 函数。
MB_TOPMOST
0x00040000L
使用 WS_EX_TOPMOST 窗口样式创建消息框。
MB_SERVICE_NOTIFICATION
0x00200000L
调用方是通知用户某个事件的服务。 函数在当前活动桌面上显示一个消息框,即使没有用户登录到计算机也是如此。终端服务: 如果调用线程具有模拟令牌,则函数会将消息框定向到模拟令牌中指定的会话。如果设置了此标志, 则 hWnd 参数必须为 NULL。 这样,消息框就可以出现在与 hWnd 对应的桌面以外的桌面上。有关使用此标志的安全注意事项的信息,请参阅 Interactive Services。 具体而言,请注意,此标志可以在锁定的桌面上生成交互式内容,因此只应用于一组非常有限的方案,例如资源耗尽。

返回值

类型: int

如果消息框有“**取消”**按钮,则如果按下 ESC 键或选择了“取消”按钮,函数将返回 IDCANCEL 值。 如果消息框没有 “取消 ”按钮,则按 ESC 将不起作用 - 除非存在MB_OK按钮。 如果显示MB_OK按钮,并且用户按 ESC,则返回值为 IDOK

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

如果函数成功,则返回值为以下菜单项值之一。

返回代码/值说明
IDABORT
3
已选择 “中止 ”按钮。
IDCANCEL
2
已选择 “取消 ”按钮。
IDCONTINUE
11
已选择“ 继续 ”按钮。
IDIGNORE
5
已选择 “忽略 ”按钮。
IDNO
7
已选择 “否 ”按钮。
IDOK
1
已选择 “确定 ”按钮。
IDRETRY
4
已选择 “重试 ”按钮。
IDTRYAGAIN
10
已选择“ 重试 ”按钮。
IDYES
6
已选择 “是 ”按钮。

TIP

通过将 uType 参数设置为相应的标志值,可以在消息框中使用以下系统图标。

图标标志值
MB_ICONHAND、MB_ICONSTOP和MB_ICONERROR图标MB_ICONHANDMB_ICONSTOPMB_ICONERROR
MB_ICONQUESTION图标MB_ICONQUESTION
MB_ICONEXCLAMATION和MB_ICONWARNING图标MB_ICONEXCLAMATIONMB_ICONWARNING
MB_ICONASTERISK和MB_ICONINFORMATION图标MB_ICONASTERISKMB_ICONINFORMATION

在 MessageBox 显示字符串的开头添加两个从右到左的标记 () ,由 Unicode 格式字符 U+200F 表示,MessageBox 呈现引擎将解释为 MessageBox 的读取顺序, (RTL) 呈现为从右到左。

使用系统模式消息框指示系统内存不足时,不应从资源文件中获取 lpTextlpCaption 参数指向的字符串,因为尝试加载资源可能会失败。

如果在对话框存在时创建消息框,请使用对话框的句柄作为 hWnd 参数。 hWnd 参数不应标识子窗口,例如对话框中的控件。

MFC MessageBox

MFC的MessageBox是属于CWnd类中的成员函数,因为MFC中基本上所有控件都集成于CWnd,所以MessageBox可以直接使用

c++
int MessageBox(
    LPCTSTR lpszText,
    LPCTSTR lpszCaption = NULL,
    UINT nType = MB_OK
);

参数

  • lpszText:指向 CString 对象或以 null 结尾的字符串,用于消息框的内容
  • lpszCaption:指向用于消息框标题CString 对象或以 null 结尾的字符串。 如果 lpszCaptionNULL,则使用默认标题“错误”。
  • nType:指定消息框的内容和行为。其值的类型同上方的::MessageBox

返回值:同上方的::MessageBox

c++
void CMainDlg::OnBnClickedButton1()
{
    MessageBox(L"wtf");
    MessageBox(_T("big dick"));
}

AfxMessageBox

AfxMessageBox属于afxwin.h头文件

c++
int AfxMessageBox(
    LPCTSTR lpszText,
    UINT nType = MB_OK,
    UINT nIDHelp = 0
);

int AFXAPI AfxMessageBox(
    UINT nIDPrompt,
    UINT nType = MB_OK,
    UINT nIDHelp = (UINT) -1
);

参数

  • lpszText:指向 CString 对象或以 null 结尾的字符串,其中包含要显示在消息框中的消息。
  • nType:消息框的样式。 将任何消息框样式应用于框。
  • nIDHelp:消息的帮助上下文 ID;0 表示将使用应用程序的默认帮助上下文。
  • nIDPrompt:一个独一无二的 ID,用于引用字符串表中的字符串。

返回值:如果因内存不足而无法显示消息框,则为零;否则返回以下值之一:

  • IDABORT:已选择“中止”按钮。
  • IDCANCEL:已选择“取消”按钮。
  • IDIGNORE:已选择“忽略”按钮。
  • IDNO:已选择“否”按钮。
  • IDOK:已选择“确定”按钮。
  • IDRETRY:已选择“重试”按钮。
  • IDYES:已选择“是”按钮。

如果消息框有“取消”按钮,则按下 ESC 键或选择“取消”按钮时,将返回 IDCANCEL 值。 如果消息框没有“取消”按钮,则按 ESC 键不起作用。

MIT Licensed