当前位置: 首页 > news >正文

详细解析格式化消息框的代码

书籍:《windows程序设计(第五版)》的开始

环境:visual studio 2022

内容:格式化消息框

说明:以下内容大部分来自腾讯元宝。

封装MessageBoxPrintf

在MessageBoxPrintf()中处理可变参数,通过va_list机制,va_start()和va_end()处理可变参数列表,然后通过_vsnwprintf_s()进行字符串格式化,最后调用MessageBox()以消息框的形式显示内容。

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>

//** CDECL 调用约定**
//指定函数参数从右到左压栈,由调用者清理栈空间。此约定与 Windows API 兼容,确保跨语言调用的一致性。
//函数签名
//函数接受两个 TCHAR* 类型的参数 szCaption(标题)和 szFormat(格式字符串),以及一个可变参数列表 ...,
// 返回 int 类型(对应 MessageBox 的返回值)。
int CDECL MessageBoxPrintf(TCHAR* szCaption, TCHAR* szFormat, ...)
{
	/***TCHAR 的动态类型**
		根据是否定义 UNICODE 宏,TCHAR 在 Windows 上等价于 wchar_t(宽字符),否则等价于 char(窄字符)。
		这使得代码无需修改即可兼容 Unicode 和 ANSI 两种模式。*/
	TCHAR szBuffer[1024];
	/*可变参数处理
		​** va_list 机制**
		通过 va_start、va_end 宏初始化和清理可变参数列表,pArgList 指向参数 szFormat 之后的参数。
		此机制允许函数接受任意数量和类型的参数。*/
	va_list pArgList;

	va_start(pArgList, szFormat);

	/*字符串格式化与安全函数
		​** _vsnwprintf_s 的作用**
		该函数是 _vsnwprintf 的安全版本,用于将格式化数据写入宽字符缓冲区。其参数包括:
		szBuffer:目标缓冲区(1024 字符容量)。
		sizeof(szBuffer) / sizeof(TCHAR):计算缓冲区的字符数(而非字节数),确保宽字符正确处理。
		_TRUNCATE:允许截断输出以防止溢出。
		szFormat 和 pArgList:格式字符串和参数列表。*/
	_vsnwprintf_s(szBuffer, sizeof(szBuffer) / sizeof(TCHAR), _TRUNCATE, szFormat, pArgList);

	va_end(pArgList);

	/*MessageBox 调用
		​功能说明
		调用 Windows API MessageBox 显示一个消息框,参数包括:
		NULL:无父窗口。
		szBuffer:格式化后的消息文本。
		szCaption:消息框标题。
		0:按钮样式(通常显示“确定”按钮)。*/
	return MessageBox(NULL, szBuffer, szCaption, 0);

}
//函数入口点解析
//​** WinMain 的作用**
//作为 Windows 应用程序的入口点函数,WinMain 负责初始化程序、创建主窗口并进入消息循环。其调用约定为 __stdcall(通过 WINAPI 宏定义),参数与标准 main 函数类似但更复杂。
//
//​参数说明
//
//参数名	类型	作用
//hInstatnce	HINSTANCE	当前应用程序实例的句柄,用于资源加载(如位图、图标)。
//hPrevInstance	HINSTANCE	前一个实例的句柄(在 32 位 Windows 中始终为 NULL)。
//szCmdLine	PSTR	指向命令行参数的指针(不含程序名),ANSI 编译模式下为 char* 。
//iCmdShow	int	控制窗口初始显示方式(如 SW_SHOW 正常显示)。
int WINAPI WinMain(HINSTANCE hInstatnce, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	int cxScreen, cyScreen;

	/*屏幕尺寸获取逻辑
		** GetSystemMetrics 函数**
		用于获取系统度量信息,SM_CXSCREEN 和 SM_CYSCREEN 分别返回屏幕的宽度和高度(以像素为单位)。*/
	cxScreen = GetSystemMetrics(SM_CXSCREEN);
	cyScreen = GetSystemMetrics(SM_CYSCREEN);

	/*消息框显示实现
		* MessageBoxPrintf 函数**
		该函数通过格式化字符串生成消息内容并调用 MessageBox 显示。*/
	MessageBoxPrintf(TEXT("ScrnSize"), TEXT("The screen is %i pixels wide by %i pixels high."), cxScreen, cyScreen);

	return 0;
}

相关内容

error C4996: ‘_vsnwprintf‘: This function or variable may be unsafe.-CSDN博客https://blog.csdn.net/qq_20725221/article/details/146374817error LNK2019: 无法解析的外部符号 main,函数 “int __cdecl invoke_main(void)“ -CSDN博客https://blog.csdn.net/qq_20725221/article/details/146374163

http://www.dtcms.com/a/77308.html

相关文章:

  • defineAsyncComponent和一般的import有什么区别
  • 微前端 qiankun vite vue3
  • cmake 之 CMakeLists.txt 中的函数是从哪里来的
  • C#基于MVC模式实现TCP三次握手,附带简易日志管理模块
  • Spring配置文件-Bean实例化三种方式
  • 神经网络中层与层之间的关联
  • Kafka-QA
  • FPGA——实现LED流水灯
  • 【二分查找】搜索插入位置 x的平方根
  • 正则表达式引擎深入探讨
  • Windows:安装Imagemagick进行Cityscapes的图像压缩
  • Python:新式类写法,多继承
  • Mac:JMeter 下载+安装+环境配置(图文详细讲解)
  • Spring学习
  • 128. Longest Consecutive Sequence
  • 力扣222. 完全二叉树的节点个数(Java实现)
  • Java 生成钻石*
  • 【高项】信息系统项目管理师(八)项目质量管理【3分】
  • 主流的Java生态下权限管理框架
  • 查看linux系统信息
  • 【linux】scp和rsync
  • PHP转GO Day2 数据类型与控制结构实践(开发计算器)
  • BRAM消耗与FIFO的关系:有效利用FPGA资源的策略
  • 面试整理--一个报告生成的方案解析
  • excel文件有两列,循环读取文件两列赋值到字典列表。字典的有两个key,分别为question和answer。将最终结果追加到json文件
  • C语言:字符串去特定字符
  • UGO和ACL
  • 从关键词到权重:TF-IDF算法解析
  • Atom of Thoughts for Markov LLM Test-Time Scaling论文解读
  • 凸集和凸函数