天天看點

1.unicode中處理寬字元集

幾個函數說明一下:

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;
}


           
1.unicode中處理寬字元集
1.unicode中處理寬字元集