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