专栏导航
上一篇:第1章,[标签 Win32] :第一个 WIn32 程序,程序入口
回到目录
下一篇:无
本节前言
本节的学习,需要前两节的内容作为先修知识。如果还没有去看本专栏的前两节,请你先去学习它们。
前两节内容的文章链接如下。
第1章,[标签 Win32] :第一个 WIn32 程序,头文件-CSDN博客
第1章,[标签 Win32] :第一个 WIn32 程序,程序入口-CSDN博客
在你学习过了上面的两篇文章教程的基础上,再来学习本节内容。
本节所采用的解决方案,是下面的文章链接所用的解决方案。
第1章,[标签 Win32] :第一个 WIn32 程序,头文件-CSDN博客
本节,我们要去讲解的,是 MessageBox 函数。
一. 本节代码
首先呢,我们还是将本节的代码给贴出来。
#include <Windows.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, TEXT("这是一个 Windows SDK 程序"),TEXT("WIndows SDK"), 0);return 0;
}
需要说明的是,本分节所给出的代码,只是解决方案里面添加的原始的代码。在本篇文章里面,大家随时需要根据本节教程的提示,修改其中的某些参数,以此来学习 MessageBox 函数。
二. MessageBox 函数简介
MessageBox 所显示的小窗口,实际上是一个对话框。它的作用,主要是用来显示简短的信息。平时,我们自己去编写程序的时候,也可以将它用作一种调试手段。
在本专栏里面,我们将 MessageBox 所形成的对话框,称作消息对话框,或者简称消息框。
MessageBox 函数的第一个参数,通常是一个窗口句柄。在本章里面,我们暂且不展开对此参数的讨论。此处只要知道,我们可以将第一个参数设置为 NULL 。事实上,本篇文章的第一分节里面,给出的代码中,MessageBox 函数的第一个参数,正是 NULL 。
第二个参数,是将要在信息框里出现的文本字符串。
第三个参数,是将要在标题栏里面显示的文本字符串。
在这里,第二个参数和第三个参数所用到的文本字符串,我们都是将其打包在了 TEXT 宏代码里面。假定,我们想要让信息框显示的内容为【你好啊,学习者】。那么,我们给第二个参数传递的内容,不是【"你好啊,学习者"】,而是【TEXT("你好啊,学习者")】。
在基础的 C 语言学习里面,字符串都是直接包含在一对英文双引号里面的。而在 Windows 程序里面,我们通常不推荐这么做,而是选择将原本的 C 字符串包含在 TEXT 宏代码里,或者 _T 宏代码,或者 __T 宏代码里。也就是,将 C 字符串【"你好啊,学习者"】写作【TEXT("你好啊,学习者")】,或者写作【_T("你好啊,学习者")】,或者写作【__T("你好啊,学习者")】。
究竟是采用哪种宏代码,看你的习惯了。
佩措尔德先生的教材里面,使用的,主要是 TEXT 宏代码。而在 Jeff Prosise 的 MFC Windows 程序设计教材里面,主要采用的是 _T 宏代码。个人觉得,_T 宏代码,算是更为简洁一些。不过,本专栏里面,很有可能,会是既使用 TEXT 宏代码,也使用 _T 宏代码。
需要注意的是,如果你使用的是 TEXT 宏代码,则程序开头只需要包含 Windows.h 头文件。如果你使用的是 _T 或者 __T 宏代码,则除了 Windows.h 头文件之外,你还需要包含 Tchar.h 头文件。
而在大家自己去编程的时候,我推荐大家使用的是 _T 宏代码。因为,使用这种形式的话,下划线,大写字母 T,括号,双引号,都是一气呵成,比较快捷一些。而 TEXT 宏代码,输入起来就需要多一些的字母了。
我们接着看第四个参数。
MessageBox 函数的第四个参数,是以 MB_ 打头的一些常量的组合。在 Winuser.h 头文件中,定义了这些相关常量。
这些常量从用途上看,可以大致分为两类。第一类是用来决定,在消息框里面显示哪些按钮。第二类是用来决定,在消息框里面显示哪些图标。
首先呢,我们来看第一类,显示按钮的常量。
(一)按钮类型
MB_ABOUTRETRYIGNORE :表示含有【关于】,【重试】,【忽略】按钮。
MB_OK :表示含有【确定】按钮。
MB_OKCANCEL :表示含有【确定】,【取消】按钮。
MB_RETRYCANCEL :表示含有【重试】,【取消】按钮。
MB_YESNO :表示含有【是】,【否】按钮。
MB_YESNOCANCEL :表示含有【是】,【否】,【取消】按钮。
WinUser.h 头文件中还给出了以下的宏定义代码。
#define MB_OK 0x00000000L
#define MB_OKCANCEL 0x00000001L
#define MB_ABORTRETRYIGNORE 0x00000002L
#define MB_YESNOCANCEL 0x00000003L
#define MB_YESNO 0x00000004L
#define MB_RETRYCANCEL 0x00000005L
某一个整数常量,后面加上大写的 L 后缀,表示此整数常量是一个 long 型整数。
由上面的代码块的内容可以知道,MB_OK 被定义为 0 。所以呢,在本节的代码里,将第四个参数设置为 0,就表示说,此消息框中含有确定按钮。
需要注意的是,上面的几个用来表示按钮的 MB_ 打头的整数常量,仅能够使用一个,不可以将两个或两个以上的按钮常量,用位或运算符【|】组合在一起。
但是呢,你可以使用 C/C++ 里面的位或运算符 【|】来把上面的其中一个按钮,跟下列常量组合起来,来描述哪个按钮为默认按钮。
#define MB_DEFBUTTON1 0x00000000L
#define MB_DEFBUTTON2 0x00000100L
#define MB_DEFBUTTON3 0x00000200L
#define MB_DEFBUTTON4 0x00000300L
到这里为止,用来表示按钮的 MB_ 常量我们就算是讲完了。
(二)图标类型
MB_ICONHAND, MB_ICONSTOP, MB_ICONERROR :三个宏常量,均表示叉号图标,用哪个都可以。
MB_ICONQUESTION :表示问号图标
MB_ICONEXCLAMATION, MB_ICONWARNING :两个宏常量,均表示感叹号图标,用哪个都可以。
MB_ASTERISK, MB_ICONINFORMATION :两个宏常量,均表示信息提示图标,用哪个都可以。
需要注意的是,上面的几个用来表示图标的 MB_ 打头的整数常量,仅能够使用一个,不可以将两个或两个以上的图标常量,用位或运算符【|】组合在一起。
以下是表示各个图标的宏常量的宏定义代码。
#define MB_ICONHAND 0x00000010L
#define MB_ICONQUESTION 0x00000020L
#define MB_ICONEXCLAMATION 0x00000030L
#define MB_ICONASTERISK 0x00000040L
(三)组合按钮类型与图标类型宏常量
在使用 MessageBox 函数的时候,对于第四个参数,你可以组合使用按钮常量与图标常量,用位或运算符【|】来将它们组合起来。注意,只可以是按钮常量中的某一个与图标常量中的某一个组合起来。
比如,可以是【MB_OKCANCEL | MB_ICONHAND】,也可以是【MB_OKCANCEL | MB_ICONWARNING】。
但是,不可以是【MB_OKCANCEL | MB_ICONHAND | MB_ICONWARNING】,不可以是【MB_OKCANCEL | MB_OK】,也不可以是【MB_ICONHAND | MB_ICONWARNING】。
也就是说,可以将按钮常量中的一个,与图标常量中的一个,用位或运算符【|】来组合在一起。但是呢,不可以用位或运算符【|】组合两个按钮常量,也不可以用位或运算符【|】组合两个图标常量。
(四)MessageBox 的返回值
返回值,与我们所点击的按钮有关。
假定,你的 MessageBox 函数里面,按钮类型为 MB_OK,且你点击了【确定】按钮,则返回的,会是 IDOK,IDOK 的值为 1 。
假定,你的 MessageBox 函数里面,按钮类型为 MB_OKCANCEL,且你点击了【取消】按钮,则返回的,会是 IDCANCEL 。
假定,你的 MessageBox 函数里面,按钮类型为 MB_YESNOCANCEL 。那么,如果你点击的按钮为【是】,则返回值为 ISYES 。如果你点击的按钮为【否】,则返回值为 ISNO 。如果你点击的按钮为【取消】,则返回值为 IDCANCEL 。
假定,你的 MessageBox 函数里面,按钮类型为 MB_ABOUTRETRYIGNORE 。那么,如果你点击的按钮为【关于】,则返回值为 IDABOUT 。如果你点击的按钮为【重试】,则返回值为 IDRETRY 。如果你点击的按钮为【忽略】,则返回值为 IDIGNORE 。
三. 案例
(一)修改信息文本与对话框标题文本
首先呢,我们修改一下第一分节的案例代码里面,MessageBox 函数的第二个参数和第三个参数。
第二个参数,它所控制的,是对话框所显示的信息文本。第三个参数,它所控制的,是对话框标题的文本。
假定,我们想要令信息文本为【天门中断楚江开】,令对话框标题为【苏轼】。那么,我们将第一分节中的 MessageBox 函数调用改为下面的样子。
MessageBox(NULL, _T("天门中断楚江开"), _T("苏轼"), 0);
另外,由于使用了 _T 宏代码,所以呢,我们还需要在程序开头部分包含 Tchar.h 头文件。
这样一来,整个 WinMain.cpp 中的代码,就成了下面的样子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("天门中断楚江开"),_T("苏轼"), 0);return 0;
}
然后呢,我们重新生成代码,然后去运行代码。结果呢,就是下面的样子。

(二)修改按钮类型
我们尝试着来修改一下按钮类型,也就是修改第四个参数。假定,我们想要显示的按钮为【是】,【否】和取消。所以呢,我们需要将按钮类型设定为 MB_YESNOCANCEL 。
我们将 MessageBox 函数修改为如下的样子。
MessageBox(NULL, _T("今天去吃火锅吗?"), _T("吃货"), MB_YESNOCANCEL);
另外,由于使用了 _T 宏代码,所以呢,我们还需要在程序开头部分包含 Tchar.h 头文件。
这样一来,整个 WinMain.cpp 中的代码,就成了下面的样子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("今天去吃火锅吗?"),_T("吃货"), MB_YESNOCANCEL);return 0;
}
运行结果如下。

(三)修改图标类型
在这里,我们来尝试去修改图标类型。第一分节的代码中,没有包含图标类型。
我们可以尝试着修改第四个参数,将其替换为 MB_ICONINFORMATION 。
整个的代码如下面所示。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("WInodws 编程很有趣"),_T("学习"), MB_ICONINFORMATION);return 0;
}
运行结果如下。

我们将代码修改为如下的样子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("WInodws 编程很有趣"),_T("学习"), MB_ICONHAND);return 0;
}
重新编译,运行,结果如下。

我们将代码修改为如下的样子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("WInodws 编程很有趣"),_T("学习"), MB_ICONQUESTION);return 0;
}
重新编译,运行,结果如下。

我们将代码修改为如下的样子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("WInodws 编程很有趣"),_T("学习"), MB_ICONEXCLAMATION);return 0;
}
重新编译,运行,结果如下。

到了这里,四种图标类型,我们就算是都看了一遍。
(四)按钮类型与图标类型的组合
我们将代码修改为如下的样子。
#include <Windows.h>
#include <Tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{MessageBox(NULL, _T("纪晓岚是汉朝的吗?"),_T("历史"), MB_YESNO | MB_ICONQUESTION);return 0;
}
重新编译,运行,结果如下。

我想,到了这里,本节内容,也就算是差不多讲完了。
MessageBox 函数,它算是 Windows 程序设计的一个基础的知识了。希望能够学好它。
结束语
到了这里,其实,第一章的内容,也就算是差不多讲完了。
有空的话,我还想要补充讲解一下命令行的知识,让大家对于命令行,多少有一个简单的入门,至少能够了解关于路径的知识。
我想,关于命令行的一点知识,我就放在第二章来讲解着了。
下一节,我们来讲第二章。
专栏导航
上一篇:第1章,[标签 Win32] :第一个 WIn32 程序,程序入口
回到目录
下一篇:无