幾個函數說明一下:
int _vsntprintf(char* str, size_t size, const char* format, va_list ap);
char *str ,把生成的格式化的字元串存放在這裡.
size_t size [in], str可接受的最大字元數 (非位元組數,UNICODE一個字元兩個位元組),防止産生數組越界.
const char *format [in], 指定輸出格式的字元串,它決定了你需要提供的可變參數的類型、個數和順序。
va_list ap, va_list變量
函數功能:将可變參數格式化輸出到一個字元數組。
用法類似于vsprintf,不過加了size的限制,防止了記憶體溢出(size為str所指的存儲空間的大小)。
傳回值:執行成功,傳回最終生成字元串的長度,若生成字元串的長度大于size,則将字元串的前size個字元複制到str,同時将原串的長度傳回(不包含終止符);執行失敗,傳回負值,并置errno.
#include <Windows.h>
#include <stdarg.h>
#include <stdio.h>
#include <tchar.h>
int CDECL MessageBoxPrintf(TCHAR* szCaption,TCHAR* szFormat,...)
{
TCHAR szBuffer[1024];
va_list pArgList;
va_start(pArgList,szFormat);
_vsntprintf(szBuffer,sizeof(szBuffer)/sizeof(TCHAR),szFormat,pArgList);
va_end(pArgList);
return MessageBox(NULL,szBuffer,szCaption,0);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR szCmdLine,int iCmdShow)
{
int cxScreen = GetSystemMetrics(SM_CXSCREEN);
int cyScreen = GetSystemMetrics(SM_CYSCREEN);
//MessageBox(NULL,TEXT("取得X和Y軸坐标"),TEXT("提示"),MB_OK);
MessageBoxPrintf(TEXT("取得X和Y軸坐标"),TEXT("X坐标為%i像素,Y坐标為%i像素!,x = %i,y = %i"),cxScreen,cyScreen,1,2);
return 0;
}
早上起來,想起我的魔獸的一個分辨率設定的問題,将我之前寫的代碼進行了優化
算是2.0版本,上代碼
// BL_REG.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <stdarg.h>
#include <tchar.h>
#define NOTICE "魔獸争霸III遊戲的顯示器分辨率設定。\n"
#define SHOW "請分别輸入顯示器的分辨率:例如:1024*768:"
#define ANSWER "輸入的分辨率為:"
#define INPUT_ERROR "輸入參數錯誤!程式退出!\n"
#define SUCCESS "設定成功!\n"
#define OPENREG_ERROR "打開系統資料庫失敗!\n"
#define SETVALUE_ERROR "設定參數失敗!\n"
BOOL CreateKey(HKEY hMainKey,LPTSTR szSubKey)
{
BOOL bRet = true;
LONG lRet;
HKEY hKey;
lRet = RegCreateKeyEx(hMainKey,
szSubKey,
0,
0,
REG_OPTION_NON_VOLATILE,
KEY_READ |KEY_WRITE,
0,
&hKey,
NULL);
if(lRet != ERROR_SUCCESS)
{
printf("%s 子鍵已存在!\n",szSubKey);
bRet = false;
}
RegCloseKey(hKey);
return bRet;
}
BOOL SetValue(DWORD dwWidth,DWORD dwHeigth)
{
BOOL bRet = true;
HKEY hKey;
LONG lRet;
lRet = RegOpenKeyEx(HKEY_CURRENT_USER,
TEXT("Software\\Blizzard Entertainment\\Warcraft III\\Video"),
0,
KEY_WRITE,
&hKey);
if(lRet == ERROR_SUCCESS)
{
lRet = RegSetValueEx(hKey,
TEXT("resheight"),
0,
REG_DWORD,
(const BYTE*)&dwHeigth,
sizeof(DWORD));
lRet =lRet || RegSetValueEx(hKey,
TEXT("reswidth"),
0,
REG_DWORD,
(const BYTE*)&dwWidth,
sizeof(DWORD));
if(lRet == ERROR_SUCCESS)
{
printf("%s",SUCCESS);
}
else
{
printf("%s",SETVALUE_ERROR);
bRet = false;
}
}
else
{
printf("%s",OPENREG_ERROR);
bRet = false;
}
RegCloseKey(hKey);
return bRet;
}
int CDECL MessageBoxPrintf(TCHAR* szCaption,TCHAR* szFormat,...)
{
int nlength = 0;
TCHAR szBuffer[1024];
va_list pArgList;
va_start(pArgList,szFormat);
_vsntprintf_s(szBuffer,sizeof(szBuffer)/sizeof(TCHAR),szFormat,pArgList);
va_end(pArgList);
return MessageBox(NULL,szBuffer,szCaption,MB_YESNO);;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance,LPSTR szCmdLine,int nCmdShow)
{
DWORD nHsize = GetSystemMetrics(SM_CXSCREEN);
DWORD nVsize = GetSystemMetrics(SM_CYSCREEN);
DWORD dwRet = 0;
dwRet = MessageBoxPrintf(L"魔獸争霸分辨率設定",L"監測到系統的分辨率為:%ix%i,是否設定為魔獸争霸III的分辨率?\n",nHsize,nVsize);
//printf("%s",NOTICE);
//printf("%s",SHOW);
//dwRet = scanf("%d*%d",&nHsize,&nVsize);
//if(dwRet == 2)
//{
// printf("%s%d*%d\n",ANSWER,nHsize,nVsize);
//}
//else
//{
// printf("%s",INPUT_ERROR);
// return 1;
//}
if(dwRet == IDYES)
{
CreateKey(HKEY_CURRENT_USER,TEXT("Software\\Blizzard Entertainment\\Warcraft III\\Video"));
SetValue(nHsize,nVsize);
}
return 0;
}