当前位置:网站首页>AfxMessageBox和MessageBox的用法
AfxMessageBox和MessageBox的用法
2022-07-01 03:19:00 【三贝勒文子】
目录
三、 AfxMessageBox和MessageBox的区别
一、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 | 选择结果 | 返回值 |
| IDOK | OK | 1 |
| IDCANCEL | CANCEL | 2 |
| IDABORT | ABORT | 3 |
| IDRETRY | RETRY | 4 |
| IDIGNORE | IGNORE | 5 |
| IDYES | YES | 6 |
| IDNO | NO | 7 |
二、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 | 选择结果 | 返回值 |
| IDOK | OK | 1 |
| IDCANCEL | CANCEL | 2 |
| IDABORT | ABORT | 3 |
| IDRETRY | RETRY | 4 |
| IDIGNORE | IGNORE | 5 |
| IDYES | YES | 6 |
| IDNO | NO | 7 |
我们来看看源代码怎么定义上面这些的:
//按钮
#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生成的是模态对话框,你不进行确认时程序不往下运行,它会阻塞你当前的线程,除非你程序是多线程的程序,否则只有等待模态对话框被确认。
边栏推荐
- The shell script uses two bars to receive external parameters
- FCN full Convolution Network Understanding and Code Implementation (from pytorch Official Implementation)
- Edlines: a real time line segment detector with a false detection control
- Golang多图生成gif
- Basic concepts of database
- 在线公网安备案保姆级教程【伸手党福利】
- Ridge regression and lasso regression
- go实现命令行的工具cli
- Let's just say I can use thousands of expression packs
- pytorch nn. AdaptiveAvgPool2d(1)
猜你喜欢

Introduction and installation of Solr

Basic concepts of database

Stop saying that you can't solve the "cross domain" problem

FCN full Convolution Network Understanding and Code Implementation (from pytorch Official Implementation)

用小程序的技术优势发展产业互联网

Avalanche problem and the use of sentinel

ASGNet论文和代码解读2

BluePrism注册下载并安装-RPA第一章

Explain spark operation mode in detail (local+standalone+yarn)

How do spark tasks of 10W workers run? (Distributed Computing)
随机推荐
Gorilla/mux framework (RK boot): RPC error code design
pytorch nn. AdaptiveAvgPool2d(1)
Test function in pychram
JUC learning
Redis tutorial
Appium自动化测试基础--补充:C/S架构和B/S架构说明
The preorder traversal of leetcode 144 binary tree and the expansion of leetcode 114 binary tree into a linked list
Valid brackets (force deduction 20)
RSN:Learning to Exploit Long-term Relational Dependencies in Knowledge Graphs
数据库DDL(Data Definition Language,数据定义语言)知识点
FCN全卷积网络理解及代码实现(来自pytorch官方实现)
FCN全卷積網絡理解及代碼實現(來自pytorch官方實現)
还在浪费脑细胞自学吗,这份面试笔记绝对是C站天花板
Take you through a circuit board, from design to production (dry goods)
torch. histc
衡量两个向量相似度的方法:余弦相似度、pytorch 求余弦相似度:torch.nn.CosineSimilarity(dim=1, eps=1e-08)
数据交换 JSON
IPv4和IPv6、局域网和广域网、网关、公网IP和私有IP、IP地址、子网掩码、网段、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?
雪崩问题以及sentinel的使用
File upload and download