www.pudn.com > GameEngine_src.rar > BaseUtil.cpp


#include "BaseUtil.h" 
#include  
#include  
#include  
#include  
 
#pragma comment( lib, "winmm.lib" ) 
 
//************************************对话框基类实现****************************************** 
CBaseDlg::CBaseDlg( int id ) 
{ 
	m_iTemplate = id; 
} 
 
CBaseDlg::~CBaseDlg() 
{ 
 
} 
 
bool CBaseDlg::CreateModeDlgHelp( HWND &hDlg, HWND hwnd, HINSTANCE hInstance, DLGPROC dlgproc ) 
{ 
	if ( hDlg == NULL ) 
	{ 
		int re; 
		re = DialogBox( hInstance, MAKEINTRESOURCE( m_iTemplate ), hwnd, dlgproc ); 
 
		if ( re == -1 ) 
		{ 
			return false; 
		} 
		else 
		{ 
			hDlg = (HWND)re; 
			return true; 
		} 
	} 
	else 
		return false; 
} 
 
bool CBaseDlg::CreateModelessDlgHelp( HWND &hDlg, HWND hwnd, HINSTANCE hInstance, DLGPROC dlgproc ) 
{ 
	if ( hDlg == NULL ) 
	{ 
		hDlg = CreateDialog( hInstance, MAKEINTRESOURCE( m_iTemplate ), hwnd, dlgproc ); 
 
		if ( hDlg == NULL ) 
		{ 
			return false; 
		} 
		else 
		{ 
			ShowWindow( hDlg, SW_SHOW ); 
			SendMessage( hwnd, WM_ACTIVATE,  WA_ACTIVE, 0 ); 
			return true; 
		} 
	} 
	else 
		return false; 
} 
 
void CBaseDlg::DestroyModeDlg( HWND hdlg, HWND &hDlg ) 
{ 
	EndDialog( hdlg, (int)hDlg ); 
	hDlg = NULL; 
 
} 
 
 
void CBaseDlg::DestroyModelessDlg( HWND hdlg, HWND &hDlg ) 
{ 
	DestroyWindow( hDlg ); 
	hDlg = NULL; 
} 
//********************************************************************************************* 
 
 
 
 
//*****************************************消息助手函数************************************ 
void Warn( LPCTSTR sz ) 
{ 
	MessageBox( NULL, sz, "warn", MB_OK ); 
} 
 
bool Ask( LPCTSTR sz ) 
{ 
	int re = MessageBox( NULL, sz, "warn", MB_YESNO ); 
 
	if ( re == IDYES ) 
		return true; 
	else 
		return false; 
} 
 
void Show( long i ) 
{ 
	char sz[32]; 
	wsprintf( sz, "%d", i ); 
	MessageBox( NULL, sz, "debug", MB_OK ); 
} 
 
void Show( LPCTSTR sz, DWORD dwValue ) 
{ 
	char buf[128]; 
	wsprintf( buf, sz, dwValue ); 
	MessageBox( NULL, buf, "debug", MB_OK ); 
} 
//********************************************************************************************* 
 
 
//******************************************CInfoDlg类定义*************************************************** 
CInfoDlg::CInfoDlg() 
{ 
	m_sz = new char[128]; 
} 
 
CInfoDlg::~CInfoDlg() 
{ 
	if ( m_sz != NULL ) 
	{ 
		delete [] m_sz; 
		m_sz = NULL; 
	} 
} 
 
void CInfoDlg::ShowInfo() 
{ 
	MessageBox( NULL, m_sz, "info", NULL ); 
	ZeroMemory( m_sz, 128 ); 
} 
 
void CInfoDlg::AddInfo( char *sz, long i ) 
{ 
	char buf[64]; 
	sprintf( buf, sz, i ); 
	//strcat( buf, "\t\t\t\t" ); 
	strcat( buf, "\n" ); 
	strcat( m_sz, buf ); 
} 
 
void CInfoDlg::AddInfoFloat( char *sz, float f ) 
{ 
	char buf[64]; 
	sprintf( buf, sz, f ); 
	//strcat( buf, "\t\t\t\t" ); 
	strcat( buf, "\n" ); 
	strcat( m_sz, buf ); 
} 
//********************************************************************************************* 
 
 
//*******************************************字符串辅助函数************************************************** 
bool IsNum( char c ) 
{ 
	return ( c >= '0' && c <= '9' ); 
} 
 
int ChToInt( char c ) 
{ 
	return int( c - 48 ); 
} 
 
//////////////////////////////////////////////////////////// 
// 
//////////////////////////////////////////////////////////// 
int Calc10E( int n ) 
{ 
	int re = 1; 
	for ( int i = 1; i <= n; i++ ) 
			re *= 10; 
	return re; 
} 
 
/////////////////////////////////////////////////////////// 
//字符串转换为整数 
/////////////////////////////////////////////////////////// 
int StringToInt( char *str ) 
{ 
	int len = strlen( str ); 
	int sum = 0; 
	for ( int i = 0; i < len; ++i ) 
	{ 
		sum += ChToInt( str[i] ) * Calc10E( len - i - 1 ); 
	} 
 
	return sum; 
} 
 
//////////////////////////////////////////////////////////// 
//字符串转变为浮点数 
//////////////////////////////////////////////////////////// 
float StringToFloat( char *sz ) 
{ 
	int n = GetDigit( sz ); 
	float j = 1.0f; 
	float re = 0.0f; 
 
	if ( *sz == '-' ) 
	{ 
		j = -1.0f; 
		++sz; 
	} 
	while ( *sz != '\0' && ( IsNum( *sz ) || *sz == '.' ) ) 
	{ 
		if ( *sz == '.' ) 
		{ 
			++sz; 
			continue; 
		} 
		else 
		{ 
			re += float( ChToInt( *sz ) ) * Compute10E( n - 1 ); 
			++sz; 
			--n; 
		} 
	} 
	return re * j; 
} 
 
//////////////////////////////////////////////////////////// 
//字符串转变为符点数,注意改变了字符指针 
//////////////////////////////////////////////////////////// 
float StringToFloat( char **sz ) 
{ 
	int n = GetDigit( *sz ); 
	float j = 1.0f; 
	float re = 0.0f; 
 
	if ( **sz == '-' ) 
	{ 
		j = -1.0f; 
		++(*sz); 
	} 
	while ( **sz != '\0' && ( IsNum( **sz ) || **sz == '.' ) ) 
	{ 
		if ( **sz == '.' ) 
		{ 
			++(*sz); 
			continue; 
		} 
		else 
		{ 
			re += float( ChToInt( **sz ) ) * Compute10E( n - 1 ); 
			++(*sz); 
			--n; 
		} 
	} 
	return re * j; 
} 
 
//////////////////////////////////////////////////////////// 
// 
//////////////////////////////////////////////////////////// 
int GetDigit( char *sz ) 
{ 
	int n = 0; 
 
	if ( *sz == '-' ) 
		++sz; 
 
	while ( *sz != '\0' && ( IsNum( *sz ) || *sz == '.' ) ) 
	{ 
		if ( *sz == '.' ) 
			break; 
		else 
		{ 
			++n; 
			++sz; 
		} 
	} 
	return n; 
} 
 
//////////////////////////////////////////////////////////// 
// 
//////////////////////////////////////////////////////////// 
float Compute10E( int n ) 
{ 
	float re = 1.0f; 
	if ( n > 0 ) 
	{ 
		for ( int i = 1; i <= n; i++ ) 
			re *= 10.0f; 
		return re; 
	} 
	else if ( n == 0 ) 
		return 1; 
	else 
		return 1 / Compute10E( abs(n) ); 
} 
 
//////////////////////////////////////////////////////////// 
//去掉一个字符串 
//////////////////////////////////////////////////////////// 
void RemoveSpace( char * out, const char *in ) 
{ 
	if ( in == 0 || out == 0 ) 
		return; 
 
	while ( *in != '\0' ) 
	{ 
		if ( *in != ' ' ) 
		{ 
			*out = *in; 
			++out; 
		} 
 
		++in; 
	} 
	*out = '\0'; 
} 
 
//////////////////////////////////////////////////////////// 
//去掉一个字符串里的指定字符,out和in可以相同 
//////////////////////////////////////////////////////////// 
void RemoveCh( char *out, const char *in, char ch ) 
{ 
	if ( in == 0 || out == 0 ) 
		return; 
 
	while ( *in != '\0' ) 
	{ 
		if ( *in != ch ) 
		{ 
			*out = *in; 
			++out; 
		} 
 
		++in; 
	} 
	*out = '\0'; 
} 
 
//////////////////////////////////////////////////////////// 
//把一个文件名的扩展名去掉,返回去掉扩展名后的文件名的长度 
//////////////////////////////////////////////////////////// 
int GetFileNameWithoutEx( const char *namein,			//原文件名 
						  char *nameex,					//扩展名 
						  char *nameout,				//去除扩展名后的文件名 
						  int size )					//nameout的长度 
{ 
	if ( namein == 0 || 0 == nameout ) 
		return false; 
 
	int len = strlen( namein ); 
	 
	for ( int i = len - 1; i >= 0; --i ) 
	{ 
		if ( namein[i] == '.' ) 
			break; 
	} 
 
	if ( i == len-1 || i < 0 )			//如果失败 
		return 0; 
 
	if ( nameex != 0 ) 
	{ 
		int k = 0; 
		for ( int j = i; j < len; ++j ) 
			nameex[k++] = namein[j]; 
		nameex[k] = '\0'; 
	} 
 
 
	memset( nameout, 0, size ); 
 
 
	for ( int j = 0; j < i; ++j ) 
		nameout[j] = namein[j]; 
	nameout[j] = '\0'; 
	return j; 
} 
 
 
//////////////////////////////////////////////////////////// 
//去除一个文件名的路径,返回文件名的长度 
//////////////////////////////////////////////////////////// 
int GetFileNameWithoutPath( const char *namein,				//原文件名 
						    char *namepath,					//路径 
							char *nameout,					//去除扩展名后的文件名 
							int size )						//nameout的长度 
{ 
	if ( namein == 0 || 0 == nameout ) 
		return false; 
 
	int len = strlen( namein ); 
	 
	for ( int i = len - 1; i >= 0; --i ) 
	{ 
		if ( namein[i] == '\\' || namein[i] == '/' ) 
			break; 
	} 
 
	if ( i == len-1 || i < 0 )			//如果失败 
		return 0; 
 
	if ( namepath != 0 ) 
	{ 
		for ( int j = 0; j <= i; ++j ) 
			namepath[j] = namein[j]; 
		namepath[j] = '\0'; 
	} 
 
 
	memset( nameout, 0, size ); 
 
	int k = 0; 
	for ( int j = i+1; j < len; ++j ) 
		nameout[k++] = namein[j]; 
 
	return k; 
} 
 
//********************************************************************************************* 
 
 
//*******************************************通用对话框辅助函数************************************************** 
//////////////////////////////////////////////////////////////////////////////////// 
//调用"打开"对话框来获取文件名,返回 
//////////////////////////////////////////////////////////////////////////////////// 
int GetFileName( HWND hWnd, char *szBuffer, int iBufferSize, const char *szFilter ) 
{ 
	OPENFILENAME ofn; 
	 
	ZeroMemory( szBuffer, iBufferSize ); 
	ofn.lStructSize       = sizeof (OPENFILENAME) ; 
	ofn.hwndOwner         = hWnd ; 
	ofn.hInstance         = NULL ; 
	ofn.lpstrFilter       = szFilter ; 
	ofn.lpstrCustomFilter = NULL ; 
	ofn.nMaxCustFilter    = 0 ; 
	ofn.nFilterIndex      = 1 ; 
	ofn.lpstrFile         = szBuffer ;           
	ofn.nMaxFile          = _MAX_PATH ; 
	ofn.lpstrFileTitle    = NULL ;           
	ofn.nMaxFileTitle     = _MAX_FNAME + _MAX_EXT ; 
	ofn.lpstrInitialDir   = NULL ; 
	ofn.lpstrTitle        = NULL ; 
	ofn.Flags             = 0; 
	ofn.nFileOffset       = 0 ; 
	ofn.nFileExtension    = 0 ; 
	ofn.lpstrDefExt       = "txt" ; 
	ofn.lCustData         = 0L ; 
	ofn.lpfnHook          = NULL ; 
	ofn.lpTemplateName    = NULL ; 
	 
	GetOpenFileName( &ofn ); 
 
	int i = ofn.nFileOffset; 
	return i; 
} 
 
 
//////////////////////////////////////////////////////////////////////////////////// 
// 
//////////////////////////////////////////////////////////////////////////////////// 
bool GetColor( HWND hwnd, DWORD *pColor ) 
{ 
	CHOOSECOLOR	cc ; 
	COLORREF    crCustColors[16] ; 
	 
	 
	cc.lStructSize		= sizeof (CHOOSECOLOR) ; 
	cc.hwndOwner		= hwnd;	 
	cc.hInstance		= NULL;	 
	cc.rgbResult		= RGB (0x80, 0x80, 0x80) ;	 
	cc.lpCustColors		= crCustColors ; 
	cc.Flags			= CC_RGBINIT | CC_FULLOPEN ; 
	cc.lCustData		= 0 ; 
	cc.lpfnHook			= NULL ; 
    cc.lpTemplateName	= NULL ; 
 
	if ( ChooseColor(&cc) != 0 && pColor != NULL ) 
	{ 
		*pColor = (DWORD)cc.rgbResult; 
		return true; 
	} 
 
	return false; 
} 
 
 
////////////////////////////////////////////////////////////////////// 
//获取一个文件的长度 
////////////////////////////////////////////////////////////////////// 
DWORD GetFileSizeHelp( FILE *fp ) 
{ 
	if ( fp == NULL ) 
		return 0; 
 
	fseek( fp, 0, SEEK_SET ); 
	fseek( fp, 0, SEEK_END ); 
	fpos_t size; 
	fgetpos( fp, &size ); 
	fseek( fp, 0, SEEK_SET ); 
 
	return (DWORD)size; 
} 
 
////////////////////////////////////////////////////////////////////// 
//获取一个文件的长度 
////////////////////////////////////////////////////////////////////// 
DWORD GetFileSize( char *filename ) 
{ 
	FILE *fp = fopen( filename, "rb" ); 
 
	fclose(fp); 
	return GetFileSizeHelp(fp); 
} 
 
//////////////////////////////////////////////////////////////////////////////////// 
// 
//////////////////////////////////////////////////////////////////////////////////// 
float GetDlgItemFloat( HWND hwnd, int nID ) 
{ 
	char sz[32]; 
	GetDlgItemText( hwnd, nID, sz, 32 ); 
	return StringToFloat( sz ); 
} 
 
//////////////////////////////////////////////////////////////////////////////////// 
// 
//////////////////////////////////////////////////////////////////////////////////// 
void SetDlgItemFloat( HWND hwnd, int nID, float f ) 
{ 
	char sz[32]; 
	sprintf( sz, "%f", f ); 
	SetDlgItemText( hwnd, nID, sz ); 
} 
 
 
////////////////////////////////////////////////////////////////////// 
// 
////////////////////////////////////////////////////////////////////// 
bool UpdateTime( int &iLastTick, int iInterval ) 
{ 
	int iThisTick = timeGetTime(); 
	if ( iThisTick - iLastTick >= iInterval ) 
	{ 
		iLastTick = iThisTick; 
		return true; 
	} 
 
	return false; 
}