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