书籍:《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