MFC学习日记-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 指针曲折转换得到的,不需要我们关心。


以下分别介绍两者:

AfxMessageBox的使用:
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表示在消息框内部显示的文本,消息框的标题为应用程序的可执行文件名(如Hello)。

在第二种形式中, nIDPrompt为要显示的文本字符串在字符串表中的ID。函数调用时会自动从字符串表中载入字符串并显示在消息框中。nType为消息框中显示的按钮风格和图标风格的组合,可以采用|(或)操作符组合各种风格。

	INT_PTR nRes;
	// 显示消息对话框 
	nRes = AfxMessageBox(_T("您确定要进行加法计算吗?"),MB_OKCANCEL | MB_ICONQUESTION,0);

	// 判断消息对话框返回值。如果为IDCANCEL就return,否则继续向下执行   
	if (IDCANCEL == nRes)
		return;

与AfxMessageBox类似的函数MessageBox,它是CWnd的类成员函数:

MessageBox的使用:

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

参数:

lpszText: 消息正文
lpszCaption:消息框标题(默认没有)
nType:消息框的风格
 

	INT_PTR nRes;
	// 显示消息对话框   
	nRes = MessageBox(_T("您确定要进行加法计算吗?"), _T("加法计算器"), MB_OKCANCEL | MB_ICONQUESTION);

	// 判断消息对话框返回值。如果为IDCANCEL就return,否则继续向下执行   
	if (IDCANCEL == nRes)
		return;

按钮风格:

nType 取值参数说明
MB_ABORTRETRY有“终止”、“重试”和“忽略”按钮
MB_OK有“确定”按钮
MB_OKCANCEL有“确定”和“取消”按钮
MB_RETRYCANCEL有“重试”和“取消”按钮
MB_YESNO有“是”和“否”按钮
MB_YESNOCANCEL有“是”、“否”和“取消”按钮


图标风格:

nType 取值显示图标
MB_ICONEXCLAMTION
MB_ICONWARNING
VS2010/MFC编程入门之十六(对话框:消息对话框)
MB_ICONASTERISK
MB_ICONINFORMATION
VS2010/MFC编程入门之十六(对话框:消息对话框)
MB_ICONQUESTIONVS2010/MFC编程入门之十六(对话框:消息对话框)
MB_ICONHAND
MB_ICONSTOP
MB_ICONERROR
VS2010/MFC编程入门之十六(对话框:消息对话框)

返回值:

我们在调用了上面两个函数后,都可以弹出模态消息对话框。消息对话框关闭后,我们也都可以得到它们的返回值。两者的返回值就是用户在消息对话框上单击的按钮的ID,可以是以下值:

      IDABORT:单击“终止”按钮。
      IDCANCEL:单击“取消”按钮。
      IDIGNORE:单击“忽略”按钮。
      IDNO:单击“否”按钮。
      IDOK:单击“确定”按钮。
      IDRETRY:单击“重试”按钮。
      IDYES:单击“是”按钮。

举例:

	AfxMessageBox(_T("Are you sure?"), MB_YESNO | MB_ICONQUESTION);
	int a = MessageBox(_T("是否确认删除?"), _T("Warning!!"), MB_YESNO | MB_ICONWARNING);
	if (a == IDYES)
		AfxMessageBox(_T("Yes"));
	else
		AfxMessageBox(_T("No"));

Messagebox函数在API和MFC里的区别:

API的定义如下
int MessageBox(
  HWND hWnd,          // handle of owner window
  LPCTSTR lpText,     // address of text in message box
  LPCTSTR lpCaption, // address of title of message box
  UINT uType          // style of message box
);

MFC里的定义如下
CWnd::MessageBox
int MessageBox(

  LPCTSTR lpszText,

  LPCTSTR lpszCaption = NULL,

  UINT nType = MB_OK

);

所以说,MFC里只是少了第一个参数,同时第三和第四都有默认值了,这就是它们的区别,其他的相同

同时在MFC的窗体类里要调用API的那个,在写成如下:
::MessageBox(NULL, "msg", "caption", MB_OK);

  • 43
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFCMessageBox是对MessageBox的封装,它有两个不同的重载函数。第一个重载函数是AfxMessageBox(UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT)-1),它可以显示一个提示信息,并提供一些按钮和图标供用户选择。第二个重载函数是CWnd的成员函数MessageBox,它也可以显示一个提示信息,并提供一些按钮和图标供用户选择。另外,MFC还提供了一个全局函数AfxMessageBox,它和MessageBox的功能类似,可以在MFC应用程序中使用。MFCMessageBox相对于Win32 API的MessageBox更加灵活和方便,可以实现自定义的MessageBox布局和风格。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MFCMessageBox的用法](https://blog.csdn.net/qq_36633275/article/details/107913192)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [MFC 自定义 MessageBox](https://download.csdn.net/download/china_o3/17713227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值