恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

第2章,[标签 Win32] :格式化的消息框

  • 首页
  • 资讯中心
  • /
  • 第2章,[标签 Win32] :格式化的消息框

相关资讯

easy-vibe Stage 3 进阶开发全景指南:从 Claude Code 核心技能到跨平台原生应用实战 2026/9/16 21:43:28
MyBatis SQL拦截器实现与性能优化实践 2026/9/16 21:43:28
C++策略模式实战:解耦算法与业务逻辑 2026/9/16 21:43:28

最新资讯

K-means聚类算法详解:从原理推导到Python手写实现与避坑指南
数学建模竞赛MATLAB算法模块:可复用、可验证、可迭代
SpringBoot+Vue选课系统设计与高并发优化实践
OpenJDK 17源码解剖实战:从java -version到汇编指令
C#远程桌面实时监控源码解析:屏幕采集与Socket传输实战
SpringBoot驾校预约管理系统开发实战

今日推荐

IoT-For-Beginners 智能语音计时器:Wio Terminal 基于 DMAC 与 Flash 的音频采集实战
基于MATLAB的CRI显色指数计算:从SPD光谱到Ra的完整流程
JSP+Servlet+MySQL博客系统源码部署与优化全攻略

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

第2章,[标签 Win32] :格式化的消息框

发布时间:2026/9/16 21:48:29
第2章,[标签 Win32] :格式化的消息框 专栏导航上一篇第2章 在 Windows 中使用 vsprintf 函数族回到目录下一篇Windows 编程基础wsprintf 函数本节前言本节的学习内容需要以上一节的内容为先修课节。而上一节的内容又需要许多的先修课节。因此在这里我把这些个你需要首先学好的先修课节给列出来。有可能呢列举得不全面。如果列举得不全还请大家去目录里面寻找相应的课节。或者你也可以与我联系。先修课节如下。参考课节编程技能格式化打印01vsprintf 函数族简介参考课节编程技能格式化打印02vsprintf参考课节编程技能格式化打印03printf参考课节编程技能格式化打印04sprintf参考课节编程技能格式化打印05格式控制符参考课节第2章 在 Windows 中使用 vsprintf 函数族在上一节的里面我谈到了在 Windows 里面不能够使用 printf 和 scanf 。可是可能还是有些人喜欢 C 语言里面的 printf 函数。在本节呢我们尝试着实现一个类似的东西。在 printf 里面它是把格式化之后的字符串显示在控制台窗口里面。在本节呢我们的程序是将格式化之后的字符串显示在消息对话框里面。所以本节的标题才叫做格式化的消息框。一. 准备函数本节呢我们需要来学习一个准备性质的函数。这个函数的名字叫做 GetSystemMetrics 。我们来看一下它的函数声明。int GetSystemMetrics(int nIndex );这个函数的返回值是一个 int 类型的整数。参数只有一个也是 int 类型是一个索引值。在这里呢这个索引值具体地可以是哪些值我们暂时不去细讲。因为在以后我们自然会更为详细地去介绍它包括较为全面地介绍它的各个索引值。然而呢本节我们只需要了解其中的两个索引值即可。这两个索引值分别是 SM_CXSCREEN 和 SM_CYSCREEN 。当传入的索引值为 SM_CXSCREEN 时GetSystemMetrics 函数返回的值为视频显示器的像素宽度。世间的显示器有很多规格有很多那么这个函数显示的是哪一款显示器的规格呢运行这个函数的计算机所配备的是什么显示器那么返回值就是哪个显示器的像素宽度。所以呢有可能我这里运行的结果是 1024而你哪里可能会是 12801440或者 1920等等。我们再来看另一个索引值。当传入的索引值为 SM_CYSCREEN 时GetSystemMetrics 函数返回的值为当前计算机所配备的视频显示器的像素高度。运行此函数时计算机配备的是什么显示器返回值就是哪个显示器的像素高度。这样一来呢准备函数我们就算是讲完了。我们接着往下讲。二. 参考函数printf本节我们想要实现的是一个格式化的消息框。直接让我们自己写的话我觉得可能会有点费劲儿。所以呢我首先列出来一个参考代码。然后呢大家根据参考代码来写正式的格式化的消息框程序。我们来看一看本节前言中讲解 printf 的那一节所给出的printf 的实现代码。static char printbuf[1024]; extern int printf(const char *fmt, ...) { va_list args; int i; va_start(args, fmt); i vsprintf(printbuf, fmt, args); va_end(args); write(1, printbuf, i); return i; }这就是 printf 的实现代码。这是我从 Linux 0.12 内核里面将其摘录出来并作了一点改动而形成的代码。接下来呢我们就尝试着去修改它来形成格式化的消息框代码。三. 格式化的消息框#include Windows.h #include tchar.h #include stdio.h static TCHAR MessageBoxBuf[1024]; int MessageBoxPrintf(LPCTSTR szCaption, LPCTSTR szFormat, ...) { va_list args; int res; va_start(args, szFormat); wvsprintf(MessageBoxBuf, szFormat, args); va_end(args); res MessageBox(NULL, MessageBoxBuf, szCaption, 0); return res; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { int cxScreen, cyScreen; cxScreen GetSystemMetrics(SM_CXSCREEN); cyScreen GetSystemMetrics(SM_CYSCREEN); MessageBoxPrintf(_T(屏幕尺寸), _T(屏幕宽度为 %d 像素屏幕高度为 %d 像素), cxScreen, cyScreen); return 0; }上面的程序我们首先来看 WinMain 函数。它的意思是通过分别传递 SM_CXSCREEN 和 SM_CYSCREEN 参数来 GetSystemMetriucs 函数求得运行此程序的计算机所配备的视频显示器的像素宽度和像素高度。在求得了像素宽度和像素高度以后通过调用我们自定义的 MessageBoxPrintf 函数来将屏幕尺寸给打印出来。接下来呢我们来看 MessageBoxPrintf 函数。我们首先来看一看它的函数声明。int MessageBoxPrintf(LPCTSTR szCaption, LPCTSTR szFormat, ...);返回值为 int 类型。参数列表里面前两个参数类型为 LPCTSTR其实就是【const TCHAR *】类型。第三个参数为可变参数列表。关于 LPCTSTR我们在之前有去讲解过。请大家参考如下信息来了解 Windows 字符类型。参考课节第2章 Windows 字符数据类型然后呢在形参变量方面前两个参数都是以 sz 作为前缀。我们之前有去讲解过匈牙利标记法。在这里我再次简单地来谈一谈匈牙利标记法。匈牙利标记法它是变量命名规范的一种。它的基本内容是用一个或者多个小写字母作为前缀来表明变量的数据类型随后是英文单词的组合每一个英文单词的首字母为大写。英文单词组合表达的是变量的含义。比如说有一个变量为 int 类型含义是高度。int可以用前缀 i 或者 n 来表示。而高度英文单词为 Height组合起来这个变量名就是 nHeight 或者 iHeight 。而与本节有关的前缀是 sz 。通常用前缀 sz 表示【以零结尾的字符串】这一数据类型。字符串的话可以是 char *可以是 WCHAR *可以是 const char *等等。只要是以零结尾的字符串都可以用前缀 sz 来标识。接下来我们来看各个参数。第一个参数szCaption它其实是待显示的消息框的标题。Caption 是【标题】的意思。谁调用了这个函数谁就来设置这个消息框标题。先回头看一看 WinMain 函数在 WinMain 函数里面我们看到调用 MessageBoxPrintf 函数时传递的第一个参数为【_T(屏幕尺寸)】所以呢我们是统一地给这个待显示的消息框设置了名为【屏幕尺寸】的标题。第二个参数szFormat它是格式字符串。第三个参数为可变参数列表。MessageBoxPrintf 函数若是不看第一个参数的话则它的第二个参数和第三个参数的组合与 printf 函数的第一个参数和第二个参数的组合是很像的都是说先是格式字符串指针然后是可变参数列表。在 printf 函数的外面我们给它设置了一个字符缓冲区代码如下。static char printbuf[1024];在 MessageBoxPrintf 函数的外面我们也给它设置了一个字符缓冲区代码如下。static TCHAR MessageBoxBuf[1024];我们的 printf 函数有一个可变参数列表型变量代码如下。va_list args;我们的 MessageBoxPrintf 函数也有一行与之相同的可变参数列表型变量代码都是相同的。printf 函数申请了一个 int 型变量代码如下。int i;我们的 MessageBoxPrintf 函数也有一行用来申请 int 型变量代码如下。int res;printf 函数里面有着三行代码分别调用了 va_start 宏函数vsprintf 函数还有 va_end 宏函数。代码如下。va_start(args, fmt); i vsprintf(printbuf, fmt, args); va_end(args);我们的 MessageBoxPrintf 函数也有三行代码分别用来调用 va_start 宏函数wvsprintf 函数还有 va_end 宏函数。代码如下。va_start(args, szFormat); wvsprintf(MessageBoxBuf, szFormat, args); va_end(args);在这里printf 函数和 MessageBoxPrintf 函数都调用了 vs_start 宏函数和 va_end 宏函数。所不同的是在格式化操作里面printf 函数调用的是 vsprintf 函数而 MessageBoxPrintf 函数调用的是 wvsprintf 函数。然而vsprintf 函数和 wvsprintf 函数函数名很像参数个数也相同。并且呢我们在上一节也讲解过 vsprintf 函数的各个版本。我们再一次将那个表格贴在下面。ASCII 版Unicode 版兼容版sprintf 类标准版sprintfswprintf_stprintf最大长度版_snprintf_snwprintf_sntprintfWindows 版wsprintfAwsprintfWwsprintfvsprintf 类标准版vsprintfvswprintf_vstprintf最大长度版_vsnprintf_vsnwprintf_vsntprintfWindows 版wvsprintfAwvsprintfWwvsprintf请问vsprintf 函数与 wvsprintf 函数有何区别一个是 C 函数中的函数专门用来处理 ASCII 字符串的格式化。另一个是 Windows API 中的函数并且它是一个兼容版的函数既可以用来处理 ASCII 字符串的格式化也可以处理 Unicode 字符串的格式化。两个函数的参数个数一样参数类型则是差不多吧。想要理解 wvsprintf你需要先理解 vsprintf 的逻辑。然后呢将 vsprintf 中的ASCII 字符与字符串都给 TCHAR 化然后你就理解了 wvsprintf 了。不过如何学好 vsprintf这个则是需要你下一番功夫了。在本节前言中我给出了 vsprintf 的课节请你务必学好它。这样一来va_start 宏函数格式化转换函数 vsprintf 或 wvsprintfva_end 宏函数这三行调用我们就差不多说完了。接下来呢在 printf 函数里面是将经过 vsprintf 格式化转换之后并且存放在字符缓冲区 printbuf 中的字符串将其作为参数传递给 write 函数把结果给打印出来代码如下。write(1, printbuf, i);通过这个 write 函数printf 函数将字符缓冲区 printbuf 中的格式化转换结果给输出显示在控制台窗口里面。不过呢这个 write 函数我们不需要去具体掌握它。因为它是 Linux 系统里面的一个系统调用与 Windows 编程没有关系。我们在这里只需要知道printf 函数是通过 write 函数把格式化之后的结果给输出显示到控制台窗口里面就可以了。至于 write 函数本身是如何工作的我们完全不用去管它。与此相对地在 MessageBoxPrintf 函数里面将形参 szCaption 所接收的消息框标题与经过 wvsprintf 格式化转换之后并且存放在字符缓冲区 MessageBoxBuf 中的字符串将其作为参数传递给 MessageBox 函数将结果以消息框的形式输出显示代码如下。res MessageBox(NULL, MessageBoxBuf, szCaption, 0);printf 函数里面的 int 型变量 i接收的是 vsprintf 的返回值而 MessageBoxPrintf 函数里面的 int 型变量 res接收的是 MessageBox 函数的返回值并且都将各自申请的 int 型变量给返回了。四. 编译运行接下来请你新建一个 Windows SDK 程序解决方案在里面添加一个名为 WinMain.cpp 的源文件并且将第三分节开头的代码块中的代码复制到 WinMain.cpp 里面然后呢编译运行它。建立 Winodws SDK 解决方案以及添加源文件编译运行的方法你如果不会可以参考下述文章链接。参考课节使用 VS2010 编写 C语言程序参考课节用 VS2019 编写C语言程序推荐你学习 VS2019 的操作方法。因为现在是 2025 年了能用 VS2019 来解决的尽量用 VS2019 吧。或者你如果安装了 VS2022用它也行。能用新的就尽量用新的。在我这里运行结果如下。图1我这里大概是因为笔记本电脑的屏幕小了一点所以呢屏幕的宽度为 1536 像素高度为 864 像素。在你那里有可能屏幕的宽度高度都比我的大也有可能比我的小。结束语这一节希望你能够学好。如果未能够学好务必要及时复习与熟悉相关课节将本节的知识给搞清楚。看过佩措尔德先生的教材的同学可能会发现我这里的代码与佩措尔德先生有所不同。佩措尔德先生在格式化操作上用的是 _vsntprintf 函数而我这里用的是 wvsprintf 函数。其实呢用哪个都可以。最好呢你两个都会用。本节没有使用 _vsntprintf 函数。你可以自行修改本节代码将 wvsprintf 替换为 _vsntprintf 函数并且修改相关的调用参数。如果本节你能够学会的话那么这说明格式化打印类的函数你就掌握得差不多了。希望你能够学好本节。加油。专栏导航上一篇第2章 在 Windows 中使用 vsprintf 函数族回到目录下一篇Windows 编程基础wsprintf 函数

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号