⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tools.cpp

📁 支持Windows 3.x、Windows 9x平台上的中文(GB、Big5)、日文(Shift JIS、EUC JIS)、韩文(KS C 5601)、HZ码的显示与输入,智能内码识别
💻 CPP
字号:
#include	"stdafx.h"
#include	<windowsx.h>

#include	"cspublic.h"
#include	"tools.h"

//把BIG5转换成GB的对象
CChangeCode	p_Big5ToGb( BIG5TOGB_LIB_NAME ) ;
//把GB转换成BIG5的对象
CChangeCode	p_GbToBig5( GBTOBIG5_LIB_NAME ) ;

//--------------------------------------------------------------------------------------------//
//将内码从BIG5转换成GB码或GB到BIG5
CChangeCode::CChangeCode( char * psFileName ):
						 CFile( psFileName , CFile::modeRead )
{
	DWORD	dwFileLen	=GetLength() ;	//得到文件长度
	if( dwFileLen % 4  )	//不能被4整除
	{
		::MessageBox( 0 , "The length of the file is wrong!" , 0 , MB_OK ) ;
		return ;
	}

	m_nItemNum	=(int)(dwFileLen / 4) ;	//表中项数
	
	//分配内存
	m_lpsList	=(char huge*)GlobalAllocPtr( GMEM_FIXED ,
							dwFileLen ) ;
	if( !m_lpsList )
	{
		::MessageBox( 0 , "GlobalAllocPtr error" , 0 , MB_OK ) ;
		return ;
	}
	
	//读出内码转换表
	ReadHuge( m_lpsList , dwFileLen ) ;
	
	Close() ;
}																	 

CChangeCode::~CChangeCode( void )
{	
	if( m_lpsList )
		GlobalFreePtr( m_lpsList ) ;
}

//改变一个汉字的内码
void 	CChangeCode::ChangeOneHzCode( LPSTR lpsHz )
{
	LONG	nFirst	=0 ;							//表头
	LONG	nLast	=m_nItemNum-1 ;			//表尾
	LONG	nMiddle ;
	LONG	nPoint ;                              	//在表中的字节偏移量
	int	n ;
	
	while( nFirst <= nLast )
	{
		nMiddle	=( nFirst + nLast ) / 2;	//二分
		
		nPoint	=nMiddle*4 ;
		n	=_fstrncmp( m_lpsList+nPoint , lpsHz , 2 ) ;	//比较
		if( !n )		//两者内码相同
		{
			//进行转换
			lpsHz[0]	=m_lpsList[nPoint+2] ;
			lpsHz[1]	=m_lpsList[nPoint+3] ;
			return ;
		}
		
		if( n<0 )
			nFirst	=nMiddle+1 ;
		else
			nLast	=nMiddle-1 ;
	}
	
	//表中没有该汉字内码,返回确省GB内码,即空格
	lpsHz[0]	=0xa1 ;
	lpsHz[1]	=0xa1 ;
}

#ifdef __cplusplus
extern "C" {
#endif

//发送汉字
#define WM_IME_CHAR 0x0286
#define	WM_IME_REPORT	0x0280
BOOL __export FAR PASCAL	SendHz( LPCSTR szResult )
{
	int	nLen	=_fstrlen( szResult ) ;
	
    HWND	hWnd =::GetFocus();
    if( !hWnd )
		hWnd	=GetFocus32() ;
	if( !hWnd )		//没有输入窗口
		return	FALSE ;

	int	i ;
	//低字0为Win,1为95;高字0为西文,1为外挂,2为中文Win
	DWORD	dwVersion	=GetWindowsVersion() ;
	if( LOWORD(dwVersion) && HIWORD(dwVersion)==2 )	//为中文96
	{
		char szTmp[3] ;
    	szTmp[2]	='\0' ;
		for( i=0; i<nLen; i+=2) 
        {
	    	if( !GetInputStatus123(2) )	//需要在汉字前加空格
				::SendMessage( hWnd , WM_CHAR , ' ' , 0 ) ;
					
   			szTmp[0] = szResult[i+1];
   			szTmp[1] = szResult[i];
   			::SendMessage(hWnd, WM_IME_REPORT,  
              						*((WPARAM*)szTmp), 0 );
            ::SendMessage(hWnd, WM_IME_CHAR,  
             						*((WPARAM*)szTmp), 1);
		}
    }   
	else
	{
		for( i=0 ; i<nLen ; i++ )
      	{
      		if( !(i%2) && !GetInputStatus123(2) )	//需要在汉字前加空格
				::SendMessage( hWnd , WM_CHAR , ' ' , 0 ) ;      				

			::SendMessage( hWnd , WM_CHAR , (BYTE)szResult[i] , 0 ) ;
		}

		::InvalidateRect( hWnd , NULL , FALSE ) ;
		::UpdateWindow( hWnd ) ;
	}

   	return TRUE ;
}

//提取字符串中的汉字串或英文串
int __export FAR PASCAL	JudgeEnOrHz( int nStartPos , int cbString , LPCSTR lpszString , 
							 int FAR *lpNowPos ) 
{
	if( nStartPos < 0 || nStartPos >= cbString )
		return	0 ;
		
	if( nStartPos == cbString-1 )
	{
		*lpNowPos	=cbString ;
		return	1 ;
	}
	
	int	nStatus ;
	if( lpszString[nStartPos] & 0x80 )
		nStatus	=2 ;
	else
		nStatus	=1 ;		
	for( int i=nStartPos ; i<cbString ; )
	{
		if( i == cbString-1 )
		{
			if( nStatus == 2 )
			{
				*lpNowPos	=i ;
				return	2 ;
			}
			else
			{
				*lpNowPos	=cbString ;
				return	1 ;
			}
		}
			
		if( lpszString[i]&0x80 )
		{
			if( nStatus == 1 )
			{
				*lpNowPos	=i ;
				return( 1 ) ;
			}
			i	+=2 ;
		}
		else
		{
			if( nStatus == 2 )
			{
				*lpNowPos	=i ;
				return( 2 ) ;
			}
			i++ ;
		}
	}

	*lpNowPos	=cbString ;
	return( nStatus ) ;
}

//把BIG5码转换成GB码
void __export FAR PASCAL ChangeBig5ToGb( LPSTR lpsStr , int nLen )
{
	for( int i=0 ; i<nLen ; i++ )
	{
		if( i < nLen-1 )
		{
			if( lpsStr[i]&0x80 )		//是一个汉字
			{
				//改变该汉字的内码
				p_Big5ToGb.ChangeOneHzCode( lpsStr+i ) ;	
				i++ ;
			}
		}
	}
}

//把GB码转换成BIG5码
void __export FAR PASCAL ChangeGbToBig5( LPSTR lpsStr , int nLen )
{
	for( int i=0 ; i<nLen ; i++ )
	{
		if( i < nLen-1 )
		{
			if( lpsStr[i]&0x80 )		//是一个汉字
			{
				//改变该汉字的内码
				p_GbToBig5.ChangeOneHzCode( lpsStr+i ) ;	
				i++ ;
			}
		}
	}
}

//把GB码转换成HZ码
void __export FAR PASCAL ChangeGbToHz( LPSTR lpsStr , int nLen )
{
	for( int i=0 ; i<nLen ; i++ )
		lpsStr[i]	&=0x7f ;
}

//画一个双线的立体边框.
//RECT描述的是要画的四边形的左上角和右下角的坐标位置,包括左上角和右下角
//bFlag为1,没有按下,0按下
//color为面上的颜色
void __export FAR PASCAL DrawTwoLineBox( HDC hdc , 
		const RECT &rect , BOOL bFlag , COLORREF color ) 
{
	CDC	dc ;
	dc.m_hDC	=hdc ;

	//浅灰笔
	CPen	LowGrayPen( PS_SOLID , 1 , RGB( 192 , 192 , 192 ) ) ;
	//深灰笔
	CPen	HighGrayPen( PS_SOLID , 1 , RGB( 128 , 128 , 128 ) ) ;
	CBrush	brush( color ) ;
	
	//画上底色
	CPen	*pOldPen	=(CPen*)dc.SelectStockObject( BLACK_PEN ) ;//黑笔
	CBrush	*pOldBrush	=dc.SelectObject( &brush ) ;
	dc.Rectangle( rect.left , rect.top , rect.right+1 , rect.bottom+1 ) ;
	dc.SelectObject( pOldBrush ) ;	//恢复刷子

	dc.SelectObject( &LowGrayPen ) ;	//浅灰笔
	if( bFlag )		//是没有按下的按钮
	{
		dc.MoveTo( rect.right-1 , rect.top ) ;
		//画左上角外面的浅灰线
		dc.LineTo( rect.left , rect.top ) ;
		dc.LineTo( rect.left , rect.bottom ) ;
	}
	else	//是按下的按钮
	{
		dc.MoveTo( rect.right , rect.top ) ;
		//画右下角外面的浅灰线
		dc.LineTo( rect.right , rect.bottom ) ;
		dc.LineTo( rect.left-1 , rect.bottom ) ;
	}
		
	//画左上角内线,没有按下是白色,按下是深灰色的
	if( bFlag )
		dc.SelectStockObject( WHITE_PEN ) ;	//白笔
	else
		dc.SelectObject( &HighGrayPen ) ;	//深灰笔
	dc.MoveTo( rect.right-2 , rect.top+1 ) ;
	dc.LineTo( rect.left+1 , rect.top+1 ) ;
	dc.LineTo( rect.left+1 , rect.bottom-1 ) ;
	//画右下角内线,没有按下是深灰色,按下是白色
	if( bFlag )
		dc.SelectObject( &HighGrayPen ) ;	
	else
		dc.SelectStockObject( WHITE_PEN ) ;
	dc.MoveTo( rect.left+1 , rect.bottom-1 ) ;
	dc.LineTo( rect.right-1 , rect.bottom-1 ) ;
	dc.LineTo( rect.right-1 , rect.top ) ;

	//恢复笔
	dc.SelectObject( pOldPen ) ;
}

//画一个单线的立体边框	
//RECT描述的是要画的四边形的左上角和右下角的坐标位置,包括左上角和右下角
//bFlag为1,没有按下,0按下
//没有按下时,color1为左上角线的颜色,color2为右下角线的颜色
//按下相反。color为面上的颜色
void __export FAR PASCAL DrawOneLineBox( HDC hdc , 
		const RECT &rect , BOOL bFlag , 
		COLORREF color1 , COLORREF color2 , COLORREF color )
{
	CDC	dc ;
	dc.m_hDC	=hdc ;

	CPen	pen1( PS_SOLID , 1 , color1 ) ;
	CPen	pen2( PS_SOLID , 1 , color2 ) ;
	CBrush	brush( color ) ;
	
	//画上底色
	CPen	*pOldPen	=dc.SelectObject( &pen2 ) ;
	CBrush	*pOldBrush	=dc.SelectObject( &brush ) ;
	dc.Rectangle( rect.left , rect.top , rect.right+1 , rect.bottom+1 ) ;
	dc.SelectObject( pOldBrush ) ;

	dc.SelectObject( &pen1 ) ;
	if( bFlag )	//没有按下
	{
		dc.MoveTo( rect.right-1 , rect.top ) ;
		//画左上角线
		dc.LineTo( rect.left , rect.top ) ;
		dc.LineTo( rect.left , rect.bottom ) ;
	}
	else
	{
		dc.MoveTo( rect.right , rect.top ) ;
		//画右下角线
		dc.LineTo( rect.right , rect.bottom ) ;
		dc.LineTo( rect.left-1 , rect.bottom ) ;
	}

	//恢复笔
	dc.SelectObject( pOldPen ) ;
}

//清屏
void __export FAR PASCAL UpdateScreen( void )
{
	::InvalidateRect( NULL , NULL , FALSE ) ;
	::UpdateWindow( GetDesktopWindow() ) ;
}

#ifdef	__cplusplus
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -