详细解析格式化消息框的代码
书籍:《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
相关文章:
详细解析格式化消息框的代码
书籍:《windows程序设计(第五版)》的开始 环境:visual studio 2022 内容:格式化消息框 说明:以下内容大部分来自腾讯元宝。 封装MessageBoxPrintf 在MessageBoxPrintf()中处理可变参数,通过va_list机制,…...
过往记录系列 篇四:年报月行情历史梳理
文章目录 系列文章市场整体走势板块表现资金面与成交量市场风格系列文章 过往记录系列 篇一:牛市板块轮动顺序梳理 过往记录系列 篇二:新年1月份(至春节前)行情历史梳理 过往记录系列 篇三:春节行情历史梳理 市场整体走势 整体趋势:震荡分化,先扬后抑 上涨概率约40%:…...
Jetson Nano 三个版本(B01 4GB、Orin 4GB、Orin 8GB)本地部署Deepseek等大模型的测评
Jetson Nano三个版本(B01 GB、Orin 4GB、Orin 8GB)本地部署Deepseek等大模型的测评 一、为什么要在终端设备部署大模型?二、 Jetson Nano推理大模型时计算资源占用情况分析为什么测试Jetson Nano?三款Jetson Nano芯片简介 三、大模型推理实验…...
基于Netty实现高性能HTTP服务的架构解析
一、HTTP协议基础 1.1 HTTP协议概述 HTTP(HyperText Transfer Protocol)作为现代Web应用的基石,是基于TCP/IP的应用层协议,具有以下核心特性: 请求/响应模型:客户端发起请求,服务端返回响应无…...
mac calDAV 日历交互
安装Bakal docker https://sabre.io/dav/building-a-caldav-client/ 在Bakal服务器上注册账户 http://localhost:8080/admin/?/users/calendars/user/1/ 在日历端登录账户: Server: http://127.0.0.1:8080/dav.php Server Path: /dav.php/principals/lion No e…...
【面试问题】Java 接口与抽象类的区别
引言 在 Java 面向对象编程中,接口(Interface)和抽象类(Abstract Class)是两个重要的抽象工具。它们都能定义未实现的方法,但设计目标和使用场景截然不同。本文将通过语法、特性和实际案例,深入…...
centos【rockylinux】安装【supervisor】的注意事项【完整版】
重新加载 systemd 配置推荐使用pip的方式安装 pip install supervisor 第二步:添加supervisord.conf配置文件 [unix_http_server] file/tmp/supervisor.sock ; UNIX socket 文件,supervisorctl 会使用 ;chmod0700 ; socket 文件的…...
数据库监控:确保业务连续性和用户体验
在数字化时代,数据库作为企业的数据心脏,其重要性不言而喻。无论是交易系统、客户关系管理系统,还是数据分析平台,都离不开数据库的支撑。然而,数据库的运行状态和性能直接影响着企业的业务连续性和用户体验。因此&…...
Deflate和Gzip压缩在HTTP响应中的作用与实现
1. 引言 HTTP响应压缩是一种优化技术,用于减少传输的数据量,从而提高网页加载速度和带宽利用率。Deflate和Gzip是两种常用的压缩算法,广泛应用于HTTP协议中。 2. Deflate与Gzip概述 2.1 Deflate算法简介 Deflate是一种无损数据压缩算法,结合了LZ77算法和哈夫曼编码。它…...
PointVLA:将 3D 世界注入视觉-语言-动作模型
25年3月来自美的集团、上海大学和华东师大的论文“PointVLA: Injecting the 3D World into Vision-Language-Action Models”。 视觉-语言-动作 (VLA) 模型利用大规模 2D 视觉语言预训练,在机器人任务方面表现出色,但它们对 RGB 图像的依赖,…...
sql server数据迁移,springboot搭建开发环境遇到的问题及解决方案
最近搭建springboot项目开发环境,数据库连的是sql server,遇到许多问题在此记录一下。 1、sql server安装教程 参考:https://www.bilibili.com/opus/944736210624970769 2、sql server导出、导入数据库 参考:https://blog.csd…...
SpringBoot-MVC配置类与 Controller 的扫描
文章目录 前言一、自动配置类位置二、自动配置类解析2.1 WebMvcAutoConfiguration2.1.1 EnableWebMvcConfiguration 2.2 DispatcherServletAutoConfiguration 三、RequestMapping 的扫描过程3.1 RequestMappingHandlerMapping#afterPropertiesSet3.2 RequestMappingHandlerMapp…...
企业年度经营计划制定与管理方法论(124页PPT)(文末有下载方式)
资料解读:企业年度经营计划制定与管理方法论 详细资料请看本解读文章的最后内容。 在企业的发展进程中,年度经营计划的制定与管理至关重要,它犹如企业前行的导航图,指引着企业在复杂多变的市场环境中稳健发展。这份《企业年度经营…...
基于微信小程序的充电桩管理系统
一、开发背景 在开发充电汽车管理系统之前,深入的需求分析至关重要。我们要充分了解不同用户群体的需求,比如私家车主希望充电过程便捷、高效、安全,能够实时查看充电状态和费用明细;出租车、网约车司机则更注重充电速度和充电桩…...
算法模型从入门到起飞系列——递归(探索自我重复的奇妙之旅)
文章目录 前言一、递归本质1.1 递归的要素1.2 递归特点 二、递归&迭代2.1 递归&迭代比较2.2 递归&迭代如何实现相同功能2.2.1 递归实现2.2.2 迭代实现2.2.3 性能对比 三、优雅的递归理解3.1 阶乘计算分解3.2 [DFS](https://blog.csdn.net/qq_38315952/article/deta…...
YOLO+OpenCV强强联手:高精度跌倒检测技术实战解析
目录 关于摔倒检测 摔倒检测核心逻辑 摔倒检测:联合多种逻辑判断 原理详细解释 1. 导入必要的库 2. 定义函数和关键点连接关系 3. 筛选有效关键点并计算边界框 4. 计算人体上下半身中心点和角度 5. 绘制关键点和连接线 6. 绘制角度标注和检测跌倒 7. 返回处理后的图…...
麒麟银河V10服务器RabbitMQ安装
安装步骤 rabbitMQ依赖于erlang的环境,所以需要先安装erlang,erlang跟rabbitMQ是有版本之间的关联关系的,根据对应的版本去安装下载,保证少出问题。 可以通过官网来查看RabbitMQ和erlang之间的版本对应关系 rabbitMQ和erlang之间…...
React Hooks主要解决什么
1、状态逻辑复用困难 在Hooks出现之前,React组件间的状态逻辑复用主要依赖高阶组件(HOC)和 render props。 Hooks 通过允许创建自定义Hook,使得状态逻辑的复用变得简单而直接 缺点 HOC 可能导致 props 命名冲突render props …...
extern和static的作用(有例子)
一、extern extern的作用 声明而非定义 extern告诉编译器某个变量或函数存在于其他地方(通常是另一个源文件),当前只是声明它,而不是定义它(分配内存)。定义只能在一个地方出现,而声明可以多次…...
基于C#的以太网通讯实现:TcpClient异步通讯详解
基于C#的以太网通讯实现:TcpClient异步通讯详解 在现代工业控制和物联网应用中,以太网通讯是一种常见的数据传输方式。本文将介绍如何使用C#实现基于TCP协议的以太网通讯,并通过异步编程提高通讯效率。我们将使用TcpClient类来实现客户端与服…...
【8】分块学习笔记
前言 分块是一种重要的高级数据结构思想,核心为大段维护,局部朴素。 顺带一提,由于个人技术水平,本篇博客的难度并没有标题所述的 8 8 8 级。分块还是很难的。 分块 分块,是“优雅的暴力”。 分块的基本思想是把数据分为若干…...
Deployment声明式更新与应用式更新对比
目录 1. 声明式更新 特点 相关命令 示例 2. 命令式更新 特点 相关命令 示例 3. 声明式更新 vs 命令式更新 4. 声明式更新的优势 5. 命令式更新的适用场景 6. 总结 在 Kubernetes 中,声明式更新和命令式更新是两种不同的资源管理方式。它们分别通过不同的…...
【蓝桥杯】省赛:分糖果(思维/模拟)
思路 数据很小,直接暴力模拟。 有意思的是一个列表如何当成循环队列写?可以arr[(i1)%n]让他右边超出时自动回到开头。 code import os import sysn int(input()) arr list(map(int,input().split()))ans 0 while 1:arr1 arr.copy()for i in range…...
在 Go 语言中生成单元测试报告
在 Go 语言中生成单元测试报告,你可以使用 go test 命令配合一些参数来实现。以下是一些常用的方法和步骤: 基本测试:首先,确保你的项目已经编写了测试文件(通常以 _test.go 结尾)。然后,在项目…...
Metasploit Framework(MSF)使用教程与命令详解
Metasploit Framework(简称MSF)是一款功能强大的开源渗透测试工具,广泛应用于网络安全领域。它集成了大量的漏洞利用模块(exploits)、辅助模块(auxiliary)和载荷(payloads࿰…...
进程间通信(1)——管道
1. 进程间通信简介 进程间通信(Inter-Process Communication,IPC)是指不同进程之间交换数据的机制。由于进程具有独立的地址空间,它们无法直接访问彼此的数据,因此需要IPC机制来实现信息共享、数据传递或同步操作。 …...
python基础8 单元测试
通过前面的7个章节,作者学习了python的各项基础知识,也学习了python的编译和执行。但在实际环境上,我们需要验证我们的代码功能符合我们的设计预期,所以需要结合python的单元测试类,编写单元测试代码。 Python有一个内…...
【正点原子K210连载】第七十六章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
第七十六章 音频FFT实验 本章将介绍CanMV下FFT的应用,通过将时域采集到的音频数据通过FFT为频域。通过本章的学习,读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节: 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…...
【杂记二】git, github, vscode等
一、前言 暂时空着... 二、git 2.1 可能的疑问 1. VSCode 项目名和 GitHub 仓库名是否需要一致? 不需要一致。 VSCode 项目名(也就是你本地的文件夹名字)和 GitHub 仓库名可以不一样。 Git 是一个分布式版本控制系统,它主要关…...
《基于Spring Boot+Vue的智慧养老系统的设计与实现》开题报告
个人主页:@大数据蟒行探索者 一、研究背景及国内外研究现状 1.研究背景 根据1982年老龄问题世界大会联合国制定的标准,如果一个国家中超过65岁的老人占全国总人口的7%以上,或者超过60岁的老人占全国总人口的10%以上,那么这个国家将被定义为“老龄化社会”[1]。 随着国…...
