AfxMessageBox和MessageBox的用法

article/2025/10/31 6:57:37

目录

一、AfxMessageBox

1. 函数定义原型

3.  返回值

二、MessageBox

1. 定义

​2. 参数介绍

三、 AfxMessageBox和MessageBox的区别

1. 区别一

2. 区别二

3. 区别三


一、AfxMessageBox

    AfxMessageBox是一种函数原型,特点是应用程序的可执行文件,功能是消息框内部显示的文本,AfxMessageBox和CWnd类成员函数类似,使用起来很方便,因为是Afx 基于框架的函数。

    对于AfxMessageBox有两种定义:

1. 函数定义原型

定义一:

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

定义二:

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

2. 参数介绍

[1]  参数1

  • 在第一种形式中,lpszText表示弹窗内容,弹窗标题为应用程序EXE可执行文件名(如Hello)。

  • 在第二种形式中,nIDPrompt为文本字符串ID。函数调用时会自动从字符串表中根据ID载入字符串显示。

[2]  nType

  • nType为消息框中显示的按钮风格和图标风格的组合,可以采用|(或)操作符组合各种风格。按钮风格有:

MB_ABORTRETRYIGNORE 消息框中显示Abort、Retry、Ignore按钮
MB_OK 显示OK按钮
MB_OKCANCEL 显示OK、Cancel按钮
MB_RETRYCANCEL 显示Retry、Cancel按钮
MB_YESNO 显示Yes、No按钮
MB_YESNOCANCEL 显示Yes、No、Cancel按钮

例子1:MB_ABORTRETRYIGNORE 

int result = AfxMessageBox(L"三贝勒文子", MB_ABORTRETRYIGNORE);      // 中止,重试,忽略
Show(result);    /* 点击中止 返回3, 点击重试 返回4 点击忽略 返回5 */

运行结果:

例子2:MB_OK 

int result = AfxMessageBox(L"三贝勒文子", MB_OK);
Show(result);          /* 点击确定 返回1 */

运行结果:

例子3:MB_OKCANCEL 

int result = AfxMessageBox(L"三贝勒文子", MB_OKCANCEL);
Show(result);    /* 点击确定 返回1, 点击取消 返回2 */

运行结果:

例子4:MB_RETRYCANCEL 

int result = AfxMessageBox(L"三贝勒文子", MB_RETRYCANCEL);
Show(result);    /* 点击重试 返回4, 点击否 返回7 点击取消 返回2 */

运行结果:

例子5:MB_YESNO 

int result = AfxMessageBox(L"三贝勒文子", MB_YESNO);
Show(result);  /* 点击是 返回6, 点击否 返回7 */

运行结果:

例子6:MB_YESNOCANCEL

int result = AfxMessageBox(L"三贝勒文子", MB_YESNOCANCEL);
Show(result);  /* 点击是 返回6, 点击否 返回7 点击取消 返回2 */

运行结果:

[3]  nIDHelp

图标风格

MB_ICONINFORMATION 显示一个i图标,表示提示
MB_ICONEXCLAMATION 显示一个惊叹号,表示警告
MB_ICONSTOP 显示手形图标,表示警告或严重错误
MB_ICONQUESTION 显示问号图标,表示疑问

例子1:MB_ICONINFORMATION 

AfxMessageBox(L"三贝勒文子", MB_ICONINFORMATION);

运行结果:

例子2:MB_ICONEXCLAMATION 

AfxMessageBox(L"三贝勒文子", MB_ICONEXCLAMATION);

运行结果:

例子3:MB_ICONSTOP 

AfxMessageBox(L"三贝勒文子", MB_ICONSTOP);

运行结果:

例子4:MB_ICONQUESTION 

AfxMessageBox(L"三贝勒文子", MB_ICONQUESTION);

运行结果:

注意事项:

如果我们只调用:

AfxMessageBox(LPCTSTR lpszText);

系统就会默认为:

AfxMessageBox(LPCTSTR lpszText,MB_OK|MB_ICONEXCLAMATION );

3.  返回值

      返回值有8种,如果内存不够,则返回0,否则返回以下值中的一种,分别对应相应的按钮被点击:IDABORT、IDCANCEL、IDIGNORE、IDNO、IDOK 、IDRETRY、IDYES。各种返回值的数值如下表:

ID选择结果返回值
IDOKOK1
IDCANCELCANCEL2
IDABORTABORT3
IDRETRYRETRY4
IDIGNOREIGNORE5
IDYESYES6
IDNONO7

二、MessageBox

    MessageBox指的是显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息。消息框中返回一个整数值,该值指示用户单击了哪个按钮。

1. 定义

定义一:

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

 定义二:

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

2. 参数介绍

[1] hWnd

此参数代表消息框拥有的窗口。如果为NULL,则消息框没有拥有窗口。

[2] lpText

消息框的内容。如果使用了Unicode库,则把文本变成:

TEXT(/*sometext*/)

[3] lpCaption

消息框的标题。如果使用了Unicode库,则把文本变成:

TEXT(/*sometext*/)

​​例子1: MessageBox

MessageBox(TEXT("三贝勒文子"), TEXT("Serven警告"), MB_TASKMODAL);​

运行结果:

可以自己设定标题

 [4] uType

指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志组中标志的组合。指定下列标志中的一个来显示消息框中的按钮以及图标。

按钮参数

含义

MB_OK

默认值。有一个确认按钮在里面。

MB_YESNO

有是和否在里面。

MB_ABORTRETRYIGNORE

有Abort(放弃),Retry(重试)和Ignore(跳过)

MB_YESNOCANCEL

消息框含有三个按钮:Yes,No和Cancel

MB_RETRYCANCEL

有Retry(重试)和Cancel(取消)

MB_OKCANCEL

消息框含有两个按钮:OK和Cancel

图标:

参数

含义

MB_ICONEXCLAMATION

一个惊叹号出现在消息框

MB_ICONWARNING

一个惊叹号出现在消息框

MB_ICONINFORMATION

一个圆圈中小写字母i组成的图标出现在消息框

MB_ICONASTERISK

一个圆圈中小写字母i组成的图标出现在消息框

MB_ICONQUESTION

一个问题标记图标出现在消息框

MB_ICONSTOP

一个停止消息图标出现在消息框

MB_ICONERROR

一个停止消息图标出现在消息框

MB_ICONHAND

一个停止消息图标出现在消息框

形态:

参数

含义

MB_APPLMODAL

在hwnd参数标识的窗口中继续工作以前,用户一定响应消息框。但是,用户可以移动到其他线程的窗口且在这些窗口中工作。根据应用程序中窗口的层次机构,用户则以移动到线程内的其他窗口。所有母消息框的子窗口自动地失效,但是弹出窗口不是这样。如果既没有指定MB_SYSTEMMODAL也没有指定MB_TASKMOOAL,则MB_APPLMODAL为缺省的。

MB_SYSTEMMODAL

除了消息框有WB_EX_TOPMOST类型,MB_APPLMODAL和MB_SYSTEMMODAL一样。用系统模态消息框来改变各种各样的用户,主要的损坏错误需要立即注意(例如,内存溢出)。如果不是那些与hwnd联系的窗口,此标志对用户对窗口的相互联系没有影响。

MB_TASKMODAL

如果参数hwnd为NULL的话,那么除了所有属于当前线程高层次的窗口失效外,MB_TASKMODALL和MB_APPLMODAL一样。当调用应用程序或库没有一个可以得到的窗口句柄时,使用此标志。但仍需要阻止输入到调用线程的其他窗口,而不是搁置其他线程。

其他:

标志

含义

MB_DEFAULT_DESKTOP_ONLY

接收输入的当前桌面一定是一个缺省桌面。否则,函数调用失败。缺省桌面是一个在用户已经纪录且以后应用程序在此上面运行的桌面。

MB_HELP

把一个Help按钮增加到消息框。选择Help按钮或按F1产生一个Help事件。

MB_RIGHT

文本为右调整

MB_RTLREADING

用在Hebrew和Arabic系统中从右到左的顺序显示消息和大写文本。

MB_SETFOREGROUND

消息框变为前景窗口。在内部系统为消息个调用SetForegroundWindow函数。

MB_TOPMOST

消息框用WS_EX_TOPMOST窗口类型来创建MB_SERVICE_NOTIFICATION。

返回值:

ID选择结果返回值
IDOKOK1
IDCANCELCANCEL2
IDABORTABORT3
IDRETRYRETRY4
IDIGNOREIGNORE5
IDYESYES6
IDNONO7

我们来看看源代码怎么定义上面这些的:

//按钮
#define MB_OK 0x00000000L
#define MB_OKCANCEL 0x00000001L
#define MB_ABORTRETRYIGNORE 0x00000002L
#define MB_YESNOCANCEL 0x00000003L
#define MB_YESNO 0x00000004L
#define MB_RETRYCANCEL 0x00000005L
//图标
#define MB_ICONHAND 0x00000010L
#define MB_ICONQUESTION 0x00000020L
#define MB_ICONEXCLAMATION 0x00000030L
#define MB_ICONASTERISK 0x00000040L
#define MB_USERICON 0x00000080L
//图标声明
#define MB_ICONWARNINGMB_ICONEXCLAMATION
#define MB_ICONERRORMB_ICONHAND
#define MB_ICONINFORMATIONMB_ICONASTERISK
#define MB_ICONSTOPMB_ICONHAND
//默认按钮声明
#define MB_DEFBUTTON1 0x00000000L
#define MB_DEFBUTTON2 0x00000100L
#define MB_DEFBUTTON3 0x00000200L
#if(WINVER>=0x0400)
#define MB_DEFBUTTON4 0x00000300L//如果支持第四个MessageBox按钮的话,定义DEFButton4
#endif
//对话框模型定义
#define MB_APPLMODAL 0x00000000L
#define MB_SYSTEMMODAL 0x00001000L
#define MB_TASKMODAL 0x00002000L
#define MB_HELP 0x00004000L//是否拥有帮助按钮
//特殊声明
#define MB_NOFOCUS 0x00008000L
#define MB_SETFOREGROUND 0x00010000L
#define MB_DEFAULT_DESKTOP_ONLY 0x00020000L
#define MB_TOPMOST 0x00040000L
#define MB_RIGHT 0x00080000L
#define MB_RTLREADING 0x00100000L

三、 AfxMessageBox和MessageBox的区别

    讲了这么多,那么AfxMessageBox和MessageBox的区别是什么呢?

1. 区别一

    MessageBox()是标准的Win32 API函数,可以直接使用;AfxMessageBox是MFC库提供的全局函数,提供了多种重载形式,需要MFC框架支持(带有afx都是基于框架的函数)。所以在Win32 SDK的情况下,只能使用MessageBox(此时MessageBox采用Win 32中的原型,hWnd设为NULL);而在MFC中,两个都能使用(此时MessageBox采用MFC中的原型,在CWnd类或者子类中使用),但是最好尽量使用AfxMessageBox,原因如下:

(1)在MFC中能用MessageBox()的地方都能用AfxMessageBox(),也就是说完全可以使用后者代替前者;

(2)AfxMessageBox这个全局函数最安全,也最简单方便,因为它是一个全局函数所以不需要对应的一个窗口类。

2. 区别二

    MessageBox比较正式,常用在要提交的应用程序版本中,可以控制标题内容,而不必采用含义不明的可执行文件名为标题(从这点上说,MessageBox比 AfxMessageBox 灵活,它可以任意设置标题,而AfxMessageBox不能)。

    AfxMessageBox不能控制消息框标题,常用于调试程序时的内部数据输出或警告(更多的时候是用于调试)。

3. 区别三

    MessageBox在Win 32中的原型,如果第一个参数hWnd设置为NULL,则生成的非模态对话框;AfxMessageBox生成的是模态对话框,你不进行确认时程序不往下运行,它会阻塞你当前的线程,除非你程序是多线程的程序,否则只有等待模态对话框被确认。


http://chatgpt.dhexx.cn/article/sIsKXoFT.shtml

相关文章

AfxMessageBox 自定义封装

一般情况下AfxMessageBox是系统提供的一个对话框,若要做这种效果的,必须重写。 实例1: void test_SgxMemDialog_AutoSize() { //使用给定大小的对话框 CSgxMemDialog dlg(180, 60); dlg.SetWindowTitle(_T(" SegeX - CT&qu…

AfxMessageBox()函数消息框按钮和图标

消息框中显示的按钮 CString str1;str1.Format(_T("MB_ABORTRETRYIGNORE"), height, width);//消息框包含三个按钮:Abort,Retry和IgnoreAfxMessageBox(str1, MB_ABORTRETRYIGNORE | MB_ICONINFORMATION, 0);CString str2;str2.Format(_T(&quo…

VC中MessageBox与AfxMessageBox用法与区别

一、MessageBox()用法 1、函数原型 Messagebox函数在Win32 API和MFC里的定义有区别。 Win32 API的定义如下: int WINAPI MessageBox(HWND hWnd, // handle of owner windowLPCTSTR lpText, // address of text in message boxLPCTSTR lpCaption, //…

MFC:AfxMessageBox函数随记

函数原型 函数原型1 int AfxMessageBox( LPCTSTR lpszText, UINT nType MB_OK, UINT nIDHelp 0 );lpszText:弹窗内容 nType :弹窗类型和按钮类型进行或,比如询问框等 函数原型2 int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType MB_OK, UIN…

MFC之MessageBox、AfxMessageBox用法

在软件中我们经常会弹出个小窗口,给一点点提示.这就会用到消息对话框.在Win32 API程序中只有MessageBox这一种用法. 而在MFC中就有三各方法: 1.调用API中的MessageBox; 2.调用CWnd的成员函数MessageBox; 3.调用全局函数AfxMessageBox; M…

字符串数组的引用(C语言实现)

一、字符串数组的定义 1.字符串的定义:是由若干有效字符构成且以字符"\0"作为结束标志的一个字符序列. 2.字符串的实现: 因为C语言中只提供字符数据类型,没有提供字符串数据类型,所有C语言中的 字符串是通过字符数组来…

Java输出字符串数组

直接toString会输出一串地址, 建议使用Arrays.toString( ),将数组转化为一个字符串输出; 如果要一个一个输出还是遍历 public static void main(String[] args) {String exp"12,23,34";String res[]exp.split(",");System.out.println(Arrays.…

c+字符串数组_了解C ++字符串数组

c+字符串数组 Hey, Folks! So, as programmers, we often deal with Arrays of all data types. We’ll cover C++ string array in today’s article. 嘿伙计! 因此,作为程序员,我们经常处理所有数据类型的数组。 我们将在今天的文章中介绍C ++字符串数组 。 声明C ++字符…

C++字符串数组

(转载文章) C提供了一种新的数据类型——字符串类型(string类型),在使用方法上,它和char、int类型一样,可以用来定义变量,这就是字符串变量——用一个名字代表一个字符序列。 实际上,string并不是C语言本身具有的基本类型,它是在C标…

【C语言】动态分配二维字符串数组

动态分配一个二维字符串数组 (1) 分配可能不连续的内存 申请 char**pps8Output (char **) malloc(n * sizeof(char *)); 对于pps8Output而言,它获得了一块动态分配的连续内存,这块连续的内存可以放n个char *指针。 下面为每一…

字符串数组的三种形式

一、字符串数组 1.0 字符串数组的两种形式 第一种形式:二维字符数组 char arry[7][10] {"Monday","Tuesday","Wednsday","Thurday","Friday","Saturday","Sunday"};在栈上分配了70字节内…

干货丨什么是字符串数组

一、概念理解 1.C语言中没有字符串类型,用一片内存空间保存一串字符,这片空间称作字符数组。 2.以‘\0’结尾的字符数组被称为字符串数组。‘\0’是字符串结束的标志。 3.用双引号括起来的都是字符串。 二、初始化 char str[6] {h,e,l,l,o,\0};//字…

c语言之字符串数组

还是在写图的存储结构的时候,遇到了问题,就是如何在一个数组中存放字符串,我相信这个问题 对于面向对象的编程语言来说,轻而易举,比如对于Java来说,直接像下面就可以了: 但是c语言没有String这个类型&…

Android 自定义弹窗提示(AlertDialog)

Android 自定义弹窗提示 Java文件: private void showDialog() {AlertDialog.Builder builder new AlertDialog.Builder(this);//获取界面View view LayoutInflater.from(this).inflate(R.layout.alert_dialog, null);//将界面填充到AlertDiaLog容器并去除边框bui…

AlertDialog对话框详例

Android—3分钟你也能学会AlertDialog对话框 在Android开发中,少不了AlertDialog对话框的使用,也是至关重要的一个功能。AlertDialog的构造方法被声明为protected,所以我们不能使用new来创建AlertDialog对象。 目录 Android—3分钟你也能学…

Android - AlertDialog 对话框

Android - AlertDialog 对话框 使用步骤&#xff1a; ①创建一个AlertDialog.Builder对象②设置标题 内容 正面负面按键 编写点击事件③调用.show() 显示AlertDialog XML部分&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLay…

AlertDialog替代ProgressDialog方案

在Android API level 26及以后版本中&#xff0c;ProgressDialog被弃用&#xff0c;使用以下方法可以替代ProgressDialog。 首先&#xff0c;使用AlertDialog新建一个对象作为容器&#xff0c;在这里我们首先设置对话标题&#xff0c;然后取消然后关闭返回键退出对话框&#x…

改变AlertDialog默认背景

安卓4.0自带的AlertDialog太丑了有木有&#xff1f;黑色的背景很难看&#xff0c;今天实现的是怎么自定义style实现改变AlertDialog背景 首先在values/styles.xml文件中增加如下style <style name"AlertDialog" parent"android:Theme.DeviceDefault.Light.…

Android App开发超实用实例 | AlertDialog对话框

介绍AlertDialog对话框从简到繁的多种设计方案,从新角度理解UI交互设计。 AlertDialog对话框允许自定义弹出对话框的内容,实现比之前讲解的几种对话框更丰富的功能。 01、带默认按钮的AlertDialog 程序单击按钮后执行第17行代码,调用自定义方法showAlertDialog()。 第22~6…

Android中AlertDialog的使用

Android中AlertDialog的使用 简述默认样式单选弹出框多选弹出框列表对话框自定义弹出框完整代码 简述 AlertDialog可以在当前的界面上显示一个对话框&#xff0c;这个对话框是置顶于所有界面元素之上的&#xff0c;能够屏蔽掉其他控件的交互能力&#xff0c;因此AlertDialog一般…