第1章,[标签 Win32] :第一个 WIn32 程序,MessageBox 函数

专栏导航

上一篇:第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;
}

然后呢,我们重新生成代码,然后去运行代码。结果呢,就是下面的样子。

图1

(二)修改按钮类型

我们尝试着来修改一下按钮类型,也就是修改第四个参数。假定,我们想要显示的按钮为【是】,【否】和取消。所以呢,我们需要将按钮类型设定为 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;
}

运行结果如下。

图2

(三)修改图标类型

在这里,我们来尝试去修改图标类型。第一分节的代码中,没有包含图标类型。

我们可以尝试着修改第四个参数,将其替换为 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;
}

运行结果如下。

图3

我们将代码修改为如下的样子。

#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;
}

重新编译,运行,结果如下。

图4

我们将代码修改为如下的样子。

#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;
}

重新编译,运行,结果如下。

图5

我们将代码修改为如下的样子。

#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;
}

重新编译,运行,结果如下。

图6

到了这里,四种图标类型,我们就算是都看了一遍。

(四)按钮类型与图标类型的组合

我们将代码修改为如下的样子。

#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;
}

重新编译,运行,结果如下。

图7

我想,到了这里,本节内容,也就算是差不多讲完了。

MessageBox 函数,它算是 Windows 程序设计的一个基础的知识了。希望能够学好它。

结束语

到了这里,其实,第一章的内容,也就算是差不多讲完了。

有空的话,我还想要补充讲解一下命令行的知识,让大家对于命令行,多少有一个简单的入门,至少能够了解关于路径的知识。

我想,关于命令行的一点知识,我就放在第二章来讲解着了。

下一节,我们来讲第二章。

专栏导航

上一篇:第1章,[标签 Win32] :第一个 WIn32 程序,程序入口

回到目录

下一篇:无

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84427.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求助帖:学Java开发方向还是网络安全方向前景好

最近网络安全被一个培训机构吹得天花乱坠&#xff0c;虽然他家既有网安又有java和UI&#xff0c;我也是学软件工程的&#xff08;山西某211&#xff0c;此机构是每年和我们学校合作的校企公司&#xff09;&#xff0c;但那里的老师仍然大力推荐我学网络安全&#xff08;渗透、代…

OpenCV 图像仿射变换之旋转

一、知识点 1、void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags INTER_LINEAR, int borderMode BORDER_CONSTANT, …

HCIP-数据通信基础

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 本篇笔记是根据B站上的视频教程整理而成&#xff0c;感谢UP主的精彩讲解&#xff01;如果需要了解更多细节&#xff0c;可以参考以下视频&#xff1a;…

C语言基本数据类型与变量详解

# C语言基本数据类型与变量详解 ## 数据类型概述 在C语言中&#xff0c;数据类型决定了变量在内存中的存储方式和大小&#xff0c;以及可以对其执行的操作。合理选择数据类型能够提高程序的效率和准确性&#xff0c;避免内存浪费和数据溢出等问题。 C语言的基本数据类型主要包括…

Babylon.js学习之路《十、高级几何体:自定义模型与复杂形状生成》

文章目录 1. 引言&#xff1a;高级几何体的应用场景2. 参数化建模&#xff1a;Babylon.MeshBuilder2.1 扩展几何体类型2.2 自定义多边形&#xff08;ExtrudePolygon&#xff09; 3. 顶点级建模&#xff1a;自定义VertexData3.1 手动定义顶点数据3.2 动态生成地形&#xff08;高…

【赵渝强老师】Kubernetes的安全框架

Kubernetes集群的安全框架主要由以下认证、鉴权和准入控制三个阶段组成。这三个阶段的关系如下图所示。 视频讲解如下 【赵渝强老师】Kubernetes的安全框架 认证&#xff08;Authentication&#xff09; 当客户端与Kubernetes集群建立HTTP通信时&#xff0c;首先HTTP请求会进…

CDN与静态资源优化

CDN与静态资源优化 在现代Web系统和AI应用中&#xff0c;随着用户访问量的不断攀升&#xff0c;静态资源&#xff08;如HTML、CSS、JavaScript、图片、音视频、模型文件等&#xff09;带来的负载日益沉重。尤其在大模型推理、前端渲染、广告投放等场景中&#xff0c;静态资源的…

如何填写“appium inspector”内容?

1. 确认已经开启appium的服务&#xff0c;运行appium 参考内容&#xff1a;{"appium:platformName": "Android", # 系统名称"appium:platformVersion": "9", # 安卓版本&#xff0c;看设备"appium:deviceName": "3d…

mysql server层做了什么

服务器处理客户端请求 服务器程序在处理来自客户端的查询请求时&#xff0c;大致需要分为3部分&#xff1a;连接管理、解析与优化、存储引擎。 连接管理 每当有一个客户端进程连接到服务器进程时&#xff0c;服务器进程都会创建一个线程专门处理与这个客户端的交互&#xff…

APISIX 简介:云原生 API 网关的架构与实践

文章目录 引言&#xff1a;APISIX 概述基于Nginx构建的原因基于etcd构建的原因 架构图示架构分层解析管理层&#xff1a;人机交互与配置入口控制层&#xff1a;配置管理与集群协调数据面&#xff1a;请求处理与流量转发说明&#xff1a;关于OpenRestry 引言&#xff1a;APISIX …

【AI作画】第3章 LORA加载器

目录 LORA加载器 管道信息 ​编辑 ​编辑 ​编辑 lora模型的串接 作品集 LORA加载器 前面我们已经分析过节点目录了&#xff0c;现在我们来看一下LORA加载器。我们进行图片渲染&#xff0c;一般都需要LORA模型的。 首先&#xff0c;我们“鼠标右键——添加节点——…

Xilinx XC7A12T‑1CPG238I Artix‑7 FPGA

XC7A12T‑1CPG238I 以其独特的性能与封装组合&#xff0c;成为诸多工程师的首选方案。下面&#xff0c;我们从多个维度对这款芯片做深入剖析。 一、产品定位与封装特点 XC7A12T‑1CPG238I 属于赛灵思&#xff08;Xilinx&#xff09;28 nm Artix‑7 系列中的入门级型号&#x…

如何利用 Java 爬虫获得微店商品详情:实战指南

在电商领域&#xff0c;微店作为众多商家的线上销售渠道之一&#xff0c;其商品详情数据对于市场分析、竞品研究和商业决策具有重要价值。Java 爬虫技术可以帮助我们高效地获取这些数据。本文将详细介绍如何使用 Java 编写爬虫&#xff0c;获取微店商品详情。 一、准备工作 &…

【Bug】MAUI自定义弹窗在IOS有异常背景

文章目录 问题问题代码原因解决处理Bug的具体步骤 问题 自定义弹窗有异常背景 问题代码 <mct:Popup xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x"http://schemas.microsoft.com/winfx/2009/xaml"xmlns:converters"clr-names…

C语言酒店管理系统:完整源码与深度解析

酒店管理系统通过自动化流程提升酒店运营效率。本系统采用C语言开发&#xff0c;基于模块化设计思想&#xff0c;包含以下核心功能&#xff1a; ​房间管理​&#xff1a;初始化房间信息、查看房间状态​预订管理​&#xff1a;按时间段预订房间、查询预订记录​入住管理​&am…

基于Gold-YOLO的聚合-分发机制改进YOLOv8教程

1. 引言 本文将详细介绍如何将Gold-YOLO的核心创新——聚合-分发(Gather-and-Distribute, GD)机制集成到YOLOv8架构中。Gold-YOLO是一种创新的目标检测架构,通过独特的信息融合策略实现了低延迟和高准确性的理想平衡。 1.1 Gold-YOLO核心特性 Gold-YOLO的主要创新点包括…

blob 的使用 文件下载 图片预览 大文件分片上传

1. 文件下载 function downloadFile(content, filename, type) {const blob new Blob([content], { type });const url URL.createObjectURL(blob);const a document.createElement(a);a.href url;a.download filename;a.click();URL.revokeObjectURL(url); }// 使用示例…

FlinkCDC-Hudi数据实时入湖原理篇

1.Hudi应用场景 面对海量数据开发场景&#xff0c;一种支持存储多种原始数据格式、多种计算引擎、高效的元数据统一管理的存储方式能极大的提高开发效率。所以在选择技术选型的时候&#xff0c;这种存储方式有以下几个特点&#xff1a; 存储原始数据&#xff0c;这些原始数据来…

sqldeveloper 创建新用户并访问其他空间特定表和视图

创建用户 右键选择创建用户 1.给用户取一个名字 VIEW_TEST 2.设置密码 123456&#xff08;建议用其他&#xff09; 3.选择表空间和临时空间 选择角色 CONNECT 连接角色 选择系统权限 然后点击应用就可以了 然后在用户哪里就能看到这个用户了 登录用户 出现成功就说明可以…

家用电器3d扫描逆向建模中科米堆手持式蓝光三维扫描仪数字建模

从厨房里的冰箱、微波炉&#xff0c;到客厅中的电视、空调&#xff0c;再到卧室的加湿器、空气净化器等&#xff0c;家用电器极大地提升了我们的生活品质。 家电市场的竞争日益激烈&#xff0c;产品更新换代速度加快&#xff0c;如何快速、精准地获取现有家电产品的三维数据&a…