本文已经搬家至https://ericnth.cn/eric_ni2008_fkx8lukq/article/1891/,请前往查看获取最新内容。

Hello大家好,我又回来了!今天,小编想要给大家带来的内容时C++API非常常用的函数之一——MesssageBox
说到MB,相信大多数追求用户界面的,用过几年(不一定要)C++的,应该都会用(仅是作者本人猜测)
本文为EricNTH的原创博客,转载请注明出处!

好了,废话不多说,我们开始!

MessageBox所在头文件:<windows.h>。在<bits/stdc++.h>里没有!没有!没有!

函数原型

//winuser.h 3010-3016行
#define MessageBox __MINGW_NAME_AW(MessageBox)
#define MessageBoxEx __MINGW_NAME_AW(MessageBoxEx)WINUSERAPI int WINAPI MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);WINUSERAPI int WINAPI MessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);WINUSERAPI int WINAPI MessageBoxExA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType,WORD wLanguageId);WINUSERAPI int WINAPI MessageBoxExW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType,WORD wLanguageId);

这里就只讲MessageBox,不讲MessageBoxEx了,MessageBoxEx可以参见这篇博客。

以后要记住,后缀带Ex的意思是Extension,是扩展的意思。MessageBoxEx扩展的是有关按钮语言的功能。

有关原型,我和大家一行行解释。

#define MessageBox __MINGW_NAME_AW(MessageBox)

//__MINGW_NAME_AW是一个很常见的宏,其定义是:
#if defined(UNICODE)
# define __MINGW_NAME_AW(func) func##W
#else
# define __MINGW_NAME_AW(func) func##A
#endif
//哦,原来,他是决定了是用函数的A形式还是W形式啊!
//那,这两种形式有什么区别呢?
//#if defined(UNICODE)
//说明,定义了UNICODE宏,就用W形式。
//W形式是宽字符(wide)形式,可以包含UNICODE字符。
//而从函数原型中也可以看出,因为一个用的是LPCSTR,另一个用的是LPCWSTR。

##是字符串拼接运算符,仅能用于宏。

你可以通过#ifdef UNICODE来检测是否使用了W版本。
接下来我们就根据A版本讲解。(W版本是类似的)
WINUSERAPI int WINAPI MessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);

第一个参数(HWND hwnd)

HWND是窗口句柄,决定了对话框所属的窗口。
如果是NULL,则作为一个独立的窗口弹出。
此参数不是很常用,所以一般写NULL就可以了。

第二个参数(LPCSTR lpText)

这个参数是对话框中显示的内容(如:An error happens!),A版本不能有UNICODE字符。

第三个参数(LPCSTR lpCaption)

这个参数是对话框的标题(如:Hint),A版本不能有UNICODE字符。

第四个参数(UINT uType)

此参数极其重要!功能极其强大!
下面小编和大家好好讲讲。

//winuser.h,2972-3008行
#define MB_OK __MSABI_LONG(0x00000000)
#define MB_OKCANCEL __MSABI_LONG(0x00000001)
#define MB_ABORTRETRYIGNORE __MSABI_LONG(0x00000002)
#define MB_YESNOCANCEL __MSABI_LONG(0x00000003)
#define MB_YESNO __MSABI_LONG(0x00000004)
#define MB_RETRYCANCEL __MSABI_LONG(0x00000005)
#define MB_CANCELTRYCONTINUE __MSABI_LONG(0x00000006)
#define MB_ICONHAND __MSABI_LONG(0x00000010)
#define MB_ICONQUESTION __MSABI_LONG(0x00000020)
#define MB_ICONEXCLAMATION __MSABI_LONG(0x00000030)
#define MB_ICONASTERISK __MSABI_LONG(0x00000040)
#define MB_USERICON __MSABI_LONG(0x00000080)
#define MB_ICONWARNING MB_ICONEXCLAMATION
#define MB_ICONERROR MB_ICONHAND
#define MB_ICONINFORMATION MB_ICONASTERISK
#define MB_ICONSTOP MB_ICONHAND
#define MB_DEFBUTTON1 __MSABI_LONG(0x00000000)
#define MB_DEFBUTTON2 __MSABI_LONG(0x00000100)
#define MB_DEFBUTTON3 __MSABI_LONG(0x00000200)
#define MB_DEFBUTTON4 __MSABI_LONG(0x00000300)
#define MB_APPLMODAL __MSABI_LONG(0x00000000)
#define MB_SYSTEMMODAL __MSABI_LONG(0x00001000)
#define MB_TASKMODAL __MSABI_LONG(0x00002000)
#define MB_HELP __MSABI_LONG(0x00004000)
#define MB_NOFOCUS __MSABI_LONG(0x00008000)
#define MB_SETFOREGROUND __MSABI_LONG(0x00010000)
#define MB_DEFAULT_DESKTOP_ONLY __MSABI_LONG(0x00020000)
#define MB_TOPMOST __MSABI_LONG(0x00040000)
#define MB_RIGHT __MSABI_LONG(0x00080000)
#define MB_RTLREADING __MSABI_LONG(0x00100000)
#define MB_SERVICE_NOTIFICATION __MSABI_LONG(0x00200000)
#define MB_SERVICE_NOTIFICATION_NT3X __MSABI_LONG(0x00040000)
#define MB_TYPEMASK __MSABI_LONG(0x0000000F)
#define MB_ICONMASK __MSABI_LONG(0x000000F0)
#define MB_DEFMASK __MSABI_LONG(0x00000F00)
#define MB_MODEMASK __MSABI_LONG(0x00003000)
#define MB_MISCMASK __MSABI_LONG(0x0000C000)

它们全是这个参数的取值。。。
而且还能叠加。。。
得,不说了,不然大家就没有信心了。

注:相同类型的不能叠加,如果不填该类型的任何一项,则默认取值为0x0000000的那一项。
叠加方法:用 位或运算符 | 连接。如:MB_OK|MB_ICONINFORMATION。基本所有API的属性都是这样叠加的。

我先给大家讲几个常用的吧!其它麻烦自行百度(不是作者懒,是我也不全认识啊)

按钮内容参数

如不填写,默认为MB_OK。
#define MB_OK __MSABI_LONG(0x00000000) //确定
#define MB_OKCANCEL __MSABI_LONG(0x00000001) //确定,取消
#define MB_ABORTRETRYIGNORE __MSABI_LONG(0x00000002) //中止,重试,忽略
#define MB_YESNOCANCEL __MSABI_LONG(0x00000003)//是,否,取消
#define MB_YESNO __MSABI_LONG(0x00000004)//是,否
#define MB_RETRYCANCEL __MSABI_LONG(0x00000005)//重试,取消
#define MB_CANCELTRYCONTINUE __MSABI_LONG(0x00000006)//取消,重试,继续

这些全部都是按钮文字的取值。(同一类型不能叠加!切记!)
老实讲,我也没搞懂为什么只有这几种组合

演示:
MessageBox(NULL, "这里是内容", "标题", MB_YESNOCANCEL);
结果如下:

图标参数

如不填写,默认为无图标。

#define MB_ICONHAND __MSABI_LONG(0x00000010)//大叉图标
#define MB_ICONQUESTION __MSABI_LONG(0x00000020)//问号图标
#define MB_ICONEXCLAMATION __MSABI_LONG(0x00000030)//警告图标
#define MB_ICONASTERISK __MSABI_LONG(0x00000040)//倒!(i)图标
#define MB_USERICON __MSABI_LONG(0x00000080)//用户图标
#define MB_ICONWARNING MB_ICONEXCLAMATION//自行理解
#define MB_ICONERROR MB_ICONHAND//自行理解
#define MB_ICONINFORMATION MB_ICONASTERISK//自行理解
#define MB_ICONSTOP MB_ICONHAND//自行理解
以上是所有图标的取值(其实也就5个)

演示:
MessageBox(GetConsoleWindow(), "这里是提示!", "提示", MB_YESNOCANCEL|MB_ICONINFORMATION);
结果:

这里我还加了第一个参数:HWND hwnd;
值为:GetConsoleWindow()(返回值是当前控制台窗口的句柄)
我截图没截出来,但你可以自行测试,看看是不是该对话框没有作为单独的一个对话框弹出?NO!
还有几个获取窗口句柄的函数:
GetDesktopWindow();
FindWindow(LPCTSTR lpszClassName, LPCTSTRlpszWindowName);(有参数,详情可以参见这位博主的博客。)

其它参数和默认参数

#define MB_DEFBUTTON1 __MSABI_LONG(0x00000000)//默认按第一个按钮
#define MB_DEFBUTTON2 __MSABI_LONG(0x00000100)//默认按第二个按钮
#define MB_DEFBUTTON3 __MSABI_LONG(0x00000200)//默认按第三个按钮
#define MB_DEFBUTTON4 __MSABI_LONG(0x00000300)//默认按第四个按钮
#define MB_TOPMOST __MSABI_LONG(0x00040000)//保持对话框在最上方
提示:默认按按钮指的是,你按下Enter键的话是按哪一个按钮,不是直接帮你按下去【呵呵】
MB_TOPMOST这个参数,就算加上,但碰到某些抢风头的程序(如极域等),还是会被"打压"下去,毕竟,人家一直在设TOPMOST嘛!

返回值

嗨嗨,大家别急着走啊,别忘了,我们对话框不只是为了好看的,还要判断用户按下的是那个按钮啊~

#define IDOK 1
#define IDCANCEL 2
#define IDABORT 3
#define IDRETRY 4
#define IDIGNORE 5
#define IDYES 6
#define IDNO 7
#define IDCLOSE 8
#define IDHELP 9
#define IDTRYAGAIN 10
#define IDCONTINUE 11#ifndef IDTIMEOUT
#define IDTIMEOUT 32000
#endif

按下的是哪个键,返回的就是ID+xx哦!
比如,我按下了“取消”键,返回的就是IDCANCEL。
至于TIMEOUT,一般是不会的哟~

The end

由于作者比较懒,而一个个截图再裁剪确实费工夫,所以只放了两张图片。不好意思啦~
对话框确实是个好玩的东西,大家没事可以上网搜搜,看看其它几个参数有什么用,可以在评论区里回复我哦!
MessageBox挺好用的,不用手动加载静态库就能用,而且易懂又方便!
还有要记住,第2个参数是内容,第3个参数是标题,别搞反了哟!
好了,今天就到这里,谢谢大家能有耐心看到这里【哈哈】

本文为EricNTH的原创博客,转载请注明出处!

大家再见!

本文已经搬家至https://ericnth.cn/c-plus-plus/2020/05/win32-messagebox/,请前往查看获取最新内容。

C++ WindowsAPI 教程:MessageBox函数详解(原创)相关推荐

  1. C++ Beep、MessageBox函数详解

    PS:前几天,我看见有位C++大神编了个程序,里面有音乐,还能弹出窗口,我觉得好厉害呀!通过几天的研究,终于写出了这篇文章. 下面为正文(别说我抄别人的 ): 我们都知道,C++中有个头文件叫做: W ...

  2. python3 format函数_Python学习教程:Python3之字符串格式化format函数详解(上)

    Python学习教程:Python3之字符串格式化format函数详解(上) 概述 在Python3中,字符串格式化操作通过format()方法或者f'string'实现.而相比于老版的字符串格式化方 ...

  3. format函数_Python学习教程:Python3之字符串格式化format函数详解(上)

    Python学习教程:Python3之字符串格式化format函数详解(上) 概述 在Python3中,字符串格式化操作通过format()方法或者f'string'实现.而相比于老版的字符串格式化方 ...

  4. python内置函数教程_Python内置函数详解

    此文参考python文档,然后结合自己的理解,写下来,一方面方便自己,让自己好好学习,顺便回忆回忆:另一方面,让喜欢的盆友也参考一下. 经查询,3.6版本总共有68个内置函数,主要分类如下: 数学运算 ...

  5. python语言入门详解-python初级教程:入门详解

    python初级教程:入门详解 Crifan Li 目录 前言 .................................................................... ...

  6. mysql日期时间操作函数详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. win7可以设定每周从哪一天开始,win2003等不能方便的修改.有的是周日开始,有的是周一开始.而 ...

  7. php中get_featured_posts()是什么意思,WordPress的Get_Posts()函数详解

    WP中获取POST有两个主要函数,Get_post()和Get_Posts().一个是获取单文章,另外一个是获取多文章,其中,官网对Get_posts()函数的描述很简单.但有的时候描述越简单的函数, ...

  8. Spark: sortBy和sortByKey函数详解

    在很多应用场景都需要对结果数据进行排序,Spark中有时也不例外.在Spark中存在两种对RDD进行排序的函数,分别是 sortBy和sortByKey函数.sortBy是对标准的RDD进行排序,它是 ...

  9. php output详解,PHP输出缓冲控制Output Control系列函数详解,output函数详解

    PHP输出缓冲控制Output Control系列函数详解,output函数详解 概述 以前研究过PHP的输入输出缓冲,不过博客搬家以后,原来文章找不到了,今天看到一篇好文,顺便转载过来. 简介 说到 ...

  10. gzdeflate函数_PHP中的gzcompress、gzdeflate、gzencode函数详解

    这篇文章主要介绍了PHP中的gzcompress.gzdeflate.gzencode函数详解,本文深入分析了它们的相同点和不同点,需要的朋友可以参考下 PHP中存在一组看起来很像的压缩解压函数: 压 ...

最新文章

  1. Java_01_Java读取Properties
  2. torchvision resize 指定生成图片的尺寸
  3. 迷宫的最短路径(bfs)
  4. mfc动态改变clip风格_echarts动态滑动平均滤波
  5. Python数据科学库-小测验
  6. C++基础::typeid、type_info
  7. JZOJ_3928. 射击 (Standard IO)
  8. 10 个基于 JavaScript 的机器学习实例
  9. oracle 11g rac进程起停
  10. linux 进程创建 c语言,linux下进程创建的C语言程序
  11. 极值波延拓matlab函数,函数极值是什么意思
  12. HTML5页面增强元素
  13. 小学生信息奥赛学c语言,适合小学生的信息学奥赛(NOIP)课程来袭!
  14. 百度文档免费复制、翻译
  15. 如何在电脑端安装哔哩哔哩?
  16. 微信公众号接入百度机器人
  17. JAVA实现经典游戏俄罗斯方块
  18. 手机开USB热点给电脑使用失败
  19. 解决导出Excel表格,浏览器不下载
  20. uboot 或者 linux 下限制 sata speed

热门文章

  1. PTA程序设计类实验辅助教学平台-基础编程题--JAVA--7.4 BCD解密
  2. 【88.4】HTTP权威指南
  3. 通信原理第三章 模拟调制系统
  4. 2022创业基础——李家华等章节测试答案以及期末考试答案
  5. DSOFramer的类别和安装
  6. Geoserver 发布 shp文件
  7. C#项目班级管理系统
  8. 做个简单的Java学生考勤系统04--签到功能的开发
  9. AD7124-4 精度
  10. python3x菜鸟教程_菜鸟教程python3