VS mfc MessageBox() 和 AfxMessageBox()

article/2025/10/31 6:38:16

转载:http://blog.csdn.net/phenixyf/article/details/41744039

 

一、MessageBox()用法

1、函数原型

Messagebox函数在Win32 API和MFC里的定义有区别。

Win32 API的定义如下:

 

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int WINAPI MessageBox(  
  2.   HWND hWnd,          // handle of owner window  
  3.   LPCTSTR lpText,     // address of text in message box  
  4.   LPCTSTR lpCaption, // address of title of message box  
  5.   UINT uType          // style of message box  
  6. );  
[cpp]  view plain  copy
  1. <span style="font-size:18px;">int WINAPI MessageBox(  
  2.   HWND hWnd,          // handle of owner window  
  3.   LPCTSTR lpText,     // address of text in message box  
  4.   LPCTSTR lpCaption, // address of title of message box  
  5.   UINT uType          // style of message box  
  6. );</span>  

MFC里定义为CWnd类的成员函数,如下:

 

 

 

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int CWnd::MessageBox(  
  2.   LPCTSTR lpszText,  
  3.   LPCTSTR lpszCaption = NULL,  
  4.   UINT nType = MB_OK  
  5. );  
[cpp]  view plain  copy
  1. <span style="font-size:18px;">int CWnd::MessageBox(  
  2.   LPCTSTR lpszText,  
  3.   LPCTSTR lpszCaption = NULL,  
  4.   UINT nType = MB_OK  
  5. );</span>  

所以说在MFC里只是少了第一个参数,同时第三个参数和第四个参数都有默认值了。

 

2、其中各个参数:

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

lpText和lpszText为消息框的内容。

lpCaption和lpszCaption为消息框的标题。

uType和nType指定一个决定对话框的内容和行为(按钮、图标、形态及其他)的位标志集。此参数可以为下列标志组中标志的组合:

(1)按钮

MB_OK:默认值。有一个确认按钮在里面。
MB_YESNO:有是和否在里面。 如果要默认否,则MB_YESNO | MB_DEFBUTTON2
MB_ABORTRETRYIGNORE:有Abort(放弃),Retry(重试)和Ignore(跳过)
MB_YESNOCANCEL:消息框含有三个按钮:Yes,No和Cancel
MB_RETRYCANCEL:有Retry(重试)和Cancel(取消)
MB_OKCANCEL:消息框含有两个按钮:OK和Cancel

(2)图标

MB_ICONEXCLAMATION:一个惊叹号出现在消息框
MB_ICONWARNING:一个惊叹号出现在消息框
MB_ICONINFORMATION:一个圆圈中小写字母i组成的图标出现在消息框
MB_ICONASTERISK:一个圆圈中小写字母i组成的图标出现在消息框
MB_ICONQUESTION:一个问题标记图标出现在消息框
MB_ICONSTOP:一个停止消息图标出现在消息框
MB_ICONERROR:一个停止消息图标出现在消息框
MB_ICONHAND:一个停止消息图标出现在消息框

(3)形态

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一样。当调用应用程序或库没有一个可以得到的窗口句柄时,使用此标志。但仍需要阻止输入到调用线程的其他窗口,而不是搁置其他线程。

(4)其他

MB_DEFAULT_DESKTOP_ONLY:接收输入的当前桌面一定是一个缺省桌面。否则,函数调用失败。缺省桌面是一个在用户已经纪录且以后应用程序在此上面运行的桌面。
MB_HELP:把一个Help按钮增加到消息框。选择Help按钮或按F1产生一个Help事件。
MB_RIGHT:文本为右调整
MB_RTLREADING:用在Hebrew和Arabic系统中从右到左的顺序显示消息和大写文本。
MB_SETFOREGROUND:消息框变为前景窗口。在内部系统为消息个调用SetForegroundWindow函数。
MB_TOPMOSI:消息框用WS_EX_TOPMOST窗口类型来创建MB_SERVICE_NOTIFICATION。

 

3、返回值(返回值-用户选择按键):

IDOK(1):OK
IDCANCEL(2):CANCEL
IDABORT(3):ABORT
IDRETRY(4):RETRY
IDIGNORE(5):IGNORE
IDYES(6):YES
IDNO(7):NO

4、使用方法分很多种,例如:

(1)在CWnd类或者子类中的应用(MFC原型)

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 1.MessageBox("这是一个最简单的消息框!");  
  2. 2.MessageBox("这是一个有标题的消息框!","标题");   
  3. 3.MessageBox("这是一个确定 取消的消息框!","标题", MB_OKCANCEL );   
  4. 4.MessageBox("这是一个警告的消息框!","标题", MB_ICONEXCLAMATION );   
  5. 5.MessageBox("这是一个两种属性的消息框!","标题", MB_ICONEXCLAMATION|MB_OKCANCEL );   
  6. 6.if(MessageBox("一种常用的应用","标题",MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL)  
  7.   return;  
[cpp]  view plain  copy
  1. <span style="font-size:18px;">1.MessageBox("这是一个最简单的消息框!");  
  2. 2.MessageBox("这是一个有标题的消息框!","标题");   
  3. 3.MessageBox("这是一个确定 取消的消息框!","标题", MB_OKCANCEL );   
  4. 4.MessageBox("这是一个警告的消息框!","标题", MB_ICONEXCLAMATION );   
  5. 5.MessageBox("这是一个两种属性的消息框!","标题", MB_ICONEXCLAMATION|MB_OKCANCEL );   
  6. 6.if(MessageBox("一种常用的应用","标题",MB_ICONEXCLAMATION|MB_OKCANCEL)==IDCANCEL)  
  7.   return;</span>  

(2)不在CWnd类或者子类中的应用(Win32原型)

 

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. ::MessageBox(NULL, "msg", "caption", MB_OK);  
  2. ::MessageBox(hWnd, "msg", "caption", MB_OK);  
[cpp]  view plain  copy
  1. <span style="font-size:18px;">::MessageBox(NULL, "msg", "caption", MB_OK);  
  2. ::MessageBox(hWnd, "msg", "caption", MB_OK);</span>  

 

其中hWnd为某窗口的句柄,或者直接用AfxMessageBox()函数。

 

二、AfxMessageBox()的用法

1、它是MFC中的全局函数,函数原型有两种:

 

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );  
[cpp]  view plain  copy
  1. <span style="font-size:18px;">int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );</span>  

 

 

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) –1 );  
[cpp]  view plain  copy
  1. <span style="font-size:18px;">int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) –1 );</span>  


2、其中各个参数:

 

第一种中lpszText表示在消息框内部显示的文本,消息框的标题为应用程序的可执行文件名(如Hello);第二种中,nIDPrompt为要显示的文本字符串在字符串表中的ID。函数调用时会自动从字符串表中载入字符串并显示在消息框中。nType为消息框中显示的按钮风格和图标风格的组合,可以采用|(或)操作符组合各种风格。

(1)按钮风格

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按钮

(2)图标风格

MB_ICONINFORMATION 显示一个i图标,表示提示

MB_ICONEXCLAMATION 显示一个惊叹号,表示警告

MB_ICONSTOP 显示手形图标,表示警告或严重错误

MB_ICONQUESTION 显示问号图标,表示疑问

 

3、返回值:

返回值有8种,如果内存不够,则返回0,否则返回以下值中的一种,分别对应相应的按钮被点击:
IDABORT The Abort button was selected.
IDCANCEL The Cancel button was selected.
IDIGNORE The Ignore button was selected.
IDNO The No button was selected.
IDOK The OK button was selected.
IDRETRY The Retry button was selected.
IDYES The Yes button was selected.

注意:如果消息框有cancel按钮,那么按下ESC按键或者点击cancel按钮后将返回IDCANCEL;如果消息框没有cancel按钮,那么按下ESC键将不起作用。

 

4、使用:
使用时,可以直接调用AfxMessageBox(LPCTSTR lpszText);

这样默认风格为AfxMessageBox(LPCTSTR lpszText,MB_OK|MB_ICONEXCLAMATION );

也可以通过nType指定风格。

 

三、AfxMessageBox()与MessageBox()的区别

 

区别一:

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这个全局函数最安全,也最简单方便,因为它是一个全局函数所以不需要对应的一个窗口类。

 

区别二:

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

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

 

区别三:

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

 

附:VC中可调用的函数大致可分三类

1、类自己的函数,只对类自己的数据成员有作用。例如MFC中 MessageBox的原型,它是属于 CWnd 类的成员函数,只能在 CWnd 和CWnd的派生类的对象中调用;

2、AFX小组在设计Application Framworks 时设计的全局函数,多冠在Afx前缀,在包含了MFC库/框架的工程中可用。例如AfxMessageBox可在任何地方调用。

3、Windows API的全局函数。对所有Windows平台下的程序设计都可以调用,如Vb,Vc,Dephi等等。例如Win32中MessageBox的原型::MessageBox(),它是Win32 API的全局函数。

这里注意1和3中MessageBox的不同原型:就是1中MessageBox的原型要比3的少一个参数,即窗口句柄hWnd,这个句柄是通过 this 指针曲折转换得到的,不需要我们关心。

转载于:https://www.cnblogs.com/ransn/p/8276231.html


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

相关文章

修改MFC中AfxMessageBox()函数的对话框标题

修改MFC中AfxMessageBox()函数的对话框标题 如何在MFC中修改AfxMessageBox()函数所弹出的对话框标题&#xff0c;步骤如下&#xff1a; 1.找到项目工程的资源视图&#xff0c;打开.rc资源文件下的String Table资源&#xff1b; 2.在String Table资源找到ID号为AFX_IDS_APP_T…

AfxMessageBox的常见应用

新建一个基于对话框的MFC应用程序AfxMessageBoxTest&#xff0c;删除对话框中原有控件。添加3个按钮&#xff0c;为每个按钮添加一些文字&#xff0c;如下图&#xff1a; 从上到下&#xff0c;依次为每个按钮添加事件函数&#xff0c;第一个按钮代码如下&#xff1a; void CA…

MFC 修改AfxMessageBox默认标题

双击新建的字符串ID&#xff0c;改为**AFX_IDS_APP_TITLE**&#xff1a; 修改标题为“温馨提示”

AfxMessageBox与MessageBox函数

创建消息提示对话框&#xff1a; 前者调用的是MFC的底层函数库&#xff0c;后者调用的是最为基本的Win32 API。 MessageBox()的函数原型如下&#xff1a; int MessageBox(LPCTSTR lpszText,LPCTSTR lpszCaption NULL,UINT nType MB_OK );参数说明&#xff1a; lpszText&am…

AfxMessageBox和MessageBox的用法

目录 一、AfxMessageBox 1. 函数定义原型 3. 返回值 二、MessageBox 1. 定义 ​2. 参数介绍 三、 AfxMessageBox和MessageBox的区别 1. 区别一 2. 区别二 3. 区别三 一、AfxMessageBox AfxMessageBox是一种函数原型&#xff0c;特点是应用程序的可执行文件&#xff…

AfxMessageBox 自定义封装

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

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

消息框中显示的按钮 CString str1;str1.Format(_T("MB_ABORTRETRYIGNORE"), height, width);//消息框包含三个按钮&#xff1a;Abort&#xff0c;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的定义如下&#xff1a; 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 &#xff1a;弹窗类型和按钮类型进行或&#xff0c;比如询问框等 函数原型2 int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType MB_OK, UIN…

MFC之MessageBox、AfxMessageBox用法

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

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

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

Java输出字符串数组

直接toString会输出一串地址&#xff0c; 建议使用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++字符串数组

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

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

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

字符串数组的三种形式

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

干货丨什么是字符串数组

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

c语言之字符串数组

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

Android 自定义弹窗提示(AlertDialog)

Android 自定义弹窗提示 Java文件&#xff1a; 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开发中&#xff0c;少不了AlertDialog对话框的使用&#xff0c;也是至关重要的一个功能。AlertDialog的构造方法被声明为protected&#xff0c;所以我们不能使用new来创建AlertDialog对象。 目录 Android—3分钟你也能学…