www.pudn.com > 智能内码识别,支持屏幕取词翻译的程序.zip > HZOUT.CPP


#include 	"stdafx.h" 
#include	 
 
#include	"cspublic.h" 
#include	"cskernel.h" 
#include	"hzout.h" 
#include	"myfunc.h" 
 
static DWORD	g_dwHzLibLen=0 ;						//汉字库长度 
static BYTE huge*	g_hpHzLib=NULL ;			//汉字库内容 
static DWORD	g_dwOtherLibLen=0 ;			//其它(日文或韩文)库长度 
static BYTE huge*	g_hpOtherLib=NULL ;		//其它(日文或韩文)库内容 
 
//char	sDotMatrix[MAX_DOT_NUM*2] ; 
//static char 	sDotBuff[34] ; 
static	BYTE huge*	g_hpDotBuff ; 
static	BYTE	g_sErrorDotBuff[34]= 
{ 
	0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 
	0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 
	0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 
	0xff , 0xff , 0xff , 0xff } ; 
/* 
static	CACHE_ITEM	*p_pFirstCache ;	//第一个汉字 
static	CACHE_ITEM	*p_pLastCache ;	//最后一个汉字 
static CACHE_ITEM	p_Cache[CACHE_HZ_NUM] ;	//cache 
*/ 
//载入显示字库 
extern "C" BOOL __export FAR PASCAL	LoadZk( void ) 
{ 
//	if( GetOutputCode()==5 )	//得到缺省输出内码,不需要显示汉字 
//		return	TRUE ; 
 
	UnloadZk( 1 ) ; 
			 
	HFILE hLib ; 
	 
	//打开汉字显示字库	 
	if( IsJt() )	//汉字输出用简体 
		hLib	=_lopen( (LPCSTR)GBZK16J , READ ) ;	//是简体 
	else 
		hLib	=_lopen( (LPCSTR)GBZK16F , READ ) ;	//是繁体 
		 
	if (hLib == HFILE_ERROR) 
	{ 
		::MessageBox( 0 , "没有安装汉字字库,没法显示汉字!" , 0 , MB_OK ) ; 
		return( FALSE ) ; 
	} 
 
	//分配内存空间 
	//得到文件长度 
	g_dwHzLibLen	=_llseek( hLib , 0L , 2 ) ; 
	if( g_dwHzLibLen == HFILE_ERROR ) 
	{ 
		::MessageBox( 0 , "汉字字库有问题!" , 0 , MB_OK ) ; 
		return( FALSE ) ; 
	}  
	_llseek( hLib , 0L , 0 ) ;	//定位到文件开始处 
		 
	g_hpHzLib	=(BYTE huge*)GlobalAllocPtr(  
								GMEM_FIXED , g_dwHzLibLen+2 ) ; 
	if( !g_hpHzLib ) 
	{ 
		::MessageBox( 0 , "GlobalAllocPtr is error!" , 0 , MB_OK ) ; 
		return( FALSE ) ; 
	} 
	 
	//读出汉字字库数据 
	if( _hread( hLib , g_hpHzLib ,  g_dwHzLibLen ) == -1L ) 
	{ 
		::MessageBox( 0 , "Read Hz Lib error!" , 0 , MB_OK ) ; 
		GlobalFreePtr( g_hpHzLib ) ; 
		g_hpHzLib	=0 ; 
		return( FALSE ) ; 
	} 
 
	//关闭汉字字库文件 
	if( _lclose( hLib ) == HFILE_ERROR ) 
	{ 
		::MessageBox( 0 , "Close Hz lib error" , 0 , MB_OK ) ; 
		GlobalFreePtr( g_hpHzLib ) ; 
		g_hpHzLib	=0 ; 
		return( FALSE ) ; 
	} 
	 
//-----------------------------------------------------------------------------------------------------//	 
//	if( !InitCache() )	//初始化Cache 
//		return	FALSE ; 
	 
	switch( GetOutputCode() )	//得到缺省输出内码 
	{ 
		case	0:	//GB 
		case	1:	//BIG5 
			return	TRUE ; 
		case	2:	//SHIFT-JIS 
		case	3:	//EUC-JIS 
			hLib	=_lopen( (LPCSTR)JIS16 , READ ) ;	//打开日文字库 
			if (hLib == HFILE_ERROR) 
			{ 
				::MessageBox( 0 , "没有安装日文字库,没法显示日文!" , 0 , MB_OK ) ; 
				return( FALSE ) ; 
			} 
			break ; 
		case	4:	//KSC5601 
			hLib	=_lopen( (LPCSTR)KSC16 , READ ) ;	//打开韩文字库 
			if (hLib == HFILE_ERROR) 
			{ 
				::MessageBox( 0 , "没有安装韩文字库,没法显示韩文!" , 0 , MB_OK ) ; 
				return( FALSE ) ; 
			} 
			break ; 
		default: 
			return	FALSE ; 
	} 
		 
	//分配空间 
	//得到文件长度 
	g_dwOtherLibLen	=_llseek( hLib , 0L , 2 ) ; 
	if( g_dwOtherLibLen == HFILE_ERROR ) 
	{ 
		::MessageBox( 0 , "日文或韩文字库有问题!" , 0 , MB_OK ) ; 
		return( FALSE ) ; 
	}  
	_llseek( hLib , 0L , 0 ) ;	//定位到文件开始处 
 
	g_hpOtherLib	=(BYTE huge*)GlobalAllocPtr(  
								GMEM_FIXED , g_dwOtherLibLen+2 ) ; 
	if( !g_hpOtherLib ) 
	{ 
		::MessageBox( 0 , "GlobalAllocPtr is error!" , 0 , MB_OK ) ; 
		return( FALSE ) ; 
	} 
	 
	//读出日文或韩文字库数据 
	if( _hread( hLib , g_hpOtherLib ,  g_dwOtherLibLen ) == -1L ) 
	{ 
		::MessageBox( 0 , "Read JIS or KSC Lib error!" , 0 , MB_OK ) ; 
		GlobalFreePtr( g_hpOtherLib ) ; 
		g_hpOtherLib	=0 ; 
		return( FALSE ) ; 
	} 
 
	//关闭日文或韩文字库文件 
	if( _lclose( hLib ) == HFILE_ERROR ) 
	{ 
		::MessageBox( 0 , "Close JIS or KSC lib error" , 0 , MB_OK ) ; 
		GlobalFreePtr( g_hpOtherLib ) ; 
		g_hpOtherLib	=0 ; 
		return( FALSE ) ; 
	} 
 
	return( TRUE ) ; 
} 
 
//卸掉显示字库,bFlag=0,卸掉非中文显示字库,bFlag=1,卸掉所有显示字库 
extern "C" void __export FAR PASCAL	UnloadZk( BOOL bFlag ) 
{ 
	if( bFlag ) 
	{ 
		if( g_hpHzLib )	//已经装入汉字字库 
		{ 
			GlobalFreePtr( g_hpHzLib ) ; 
			g_hpHzLib	=NULL ; 
		} 
	} 
	 
	if( g_hpOtherLib )	//已经装入日文或韩文字库 
	{ 
		GlobalFreePtr( g_hpOtherLib ) ; 
		g_hpOtherLib	=NULL ; 
	} 
} 
 
//--------------------------------------------------------------// 
 
//显示一行文本 
BOOL __export FAR PASCAL TextOutString(  
					HDC hdc , int nXStart , int nYStart ,  
				   LPCSTR lpString , int cbString ) 
{ 
	TEXTMETRIC	textMetric ; 
	GetTextMetrics( hdc , (TEXTMETRIC FAR*)&textMetric ) ; 
	 
	int		nCharWidth[256] ; 
	GetCharWidth( hdc , 0 , 255 , (int FAR*)nCharWidth ) ; 
 
	int		nWidth ; 
	int		nHeight	; 
	nHeight	=textMetric.tmHeight ; 
	int		nHalfHzWidth	=nHeight/2 ;	//半个汉字宽度 
	int		nOneHzWidth	=nHalfHzWidth+nHalfHzWidth ;	//一个汉字宽度 
 
	int		nResult ; 
	int		nNowPos ; 
	int		j ; 
	for( int i=0 ; ileft ; 
//				break ; 
			case	TA_CENTER: 
				nXStart	=( lprc->left + lprc->right )/2 ; 
				break ; 
			case	TA_RIGHT: 
				nXStart	=lprc->right ; 
				break ; 
		} 
			 
		switch( ( TA_BASELINE | TA_BOTTOM | TA_TOP ) & uiTextAlign ) 
		{ 
			case	 TA_BASELINE: 
				if( GetMapMode( hdc ) == MM_TEXT )			 
					nYStart	-=textMetric.tmAscent ; 
				else 
					nYStart	+=textMetric.tmAscent ; 
				break ; 
			case	TA_BOTTOM: 
				nYStart	=lprc->bottom-textMetric.tmHeight ; 
				break ; 
//			case	TA_TOP: 
//				nYStart	=lprc->top ; 
//				break ; 
		} 
	} 
 
//------------------------------------------------------------------------// 
 
	int		nCharWidth[256] ; 
	GetCharWidth( hdc , 0 , 255 , (int FAR*)nCharWidth ) ; 
 
	int		nWidth ; 
	int		nHeight	;//=textMetric.tmHeight ; 
	nHeight	=textMetric.tmHeight ; 
	int		nCharExtra	=GetTextCharacterExtra( hdc) ; 
 
	int		nResult ; 
	int		nNowPos ; 
	int		j ; 
	for( int i=0 ; i g_dwHzLibLen-32 )	//输入内码有问题 
			{ 
//				for( i=0 ; i<32 ; i++ ) 
//					sDotBuff[i]	=0 ;	//返回空 
				g_hpDotBuff	=(BYTE huge*)g_sErrorDotBuff ; 
				return	0 ; 
			} 
         
//			for( i=0 ; i<32 ; i++ ) 
//				sDotBuff[i]	=~(*( hpHzLib+dwPos+i )) ; 
			g_hpDotBuff	=g_hpHzLib+dwPos ; 
			return	1 ; 
		case	2:	//SHIFT-JIS 
			if( bPosNum == 0x7f ) 
			{ 
//				for( int j=0 ; j<32 ; j++ ) 
//					sDotBuff[j]	=0xff ; 
				g_hpDotBuff	=(BYTE huge*)g_sErrorDotBuff ; 
 
				return	0 ; 
			} 
			if( bPosNum > 0x7f ) 
				bPosNum-- ; 
 
			if( (bAreaNum>=0x81 && bAreaNum<0x88) || 
				(bAreaNum==0x88 && bPosNum<0x9e) ) 
				dwPos	=( ( bAreaNum-0x81 )*188L+bPosNum-0x40 )*32L ; 
			else if( (bAreaNum>0x88 && bAreaNum<=0x9f ) || 
					 (bAreaNum==0x88 && bPosNum>=0x9e ) ) 
				dwPos	=( ( bAreaNum-0x81-2 )*188L+bPosNum-0x40-0x5e )*32L ; 
			else if( (bAreaNum>=0xe0 && bAreaNum<0xea) || 
					 (bAreaNum==0xea && bPosNum<=0xa1 ) ) 
				dwPos	=( ( bAreaNum-0xe0-2 )*188L+bPosNum-0x40L-0x5eL+5828L )*32L ; 
			else 
			{ 
//				for( int j=0 ; j<32 ; j++ ) 
//					sDotBuff[j]	=0xff ; 
				g_hpDotBuff	=(BYTE huge*)g_sErrorDotBuff ; 
				return	0 ; 
			} 
			break ; 
		case	3:	//EUC-JIS 
			if( bAreaNum<0xb0 ) 
				dwPos	=((bAreaNum-0xa1)*94L+bPosNum-0xa1)*32L ; 
			else 
				dwPos	=((bAreaNum-0xb0)*94L+bPosNum-0xa1+940L)*32L ; 
			break ; 
		case	4:	//KSC5601 
			if( bAreaNum<0xb0 ) 
				dwPos	=((bAreaNum-0xa1)*94L+bPosNum-0xa1)*32L ; 
			else 
				dwPos	=((bAreaNum-0xb0)*94L+bPosNum-0xa1+1128L)*32L ; 
			break ; 
		default: 
			g_hpDotBuff	=(BYTE huge*)g_sErrorDotBuff ; 
			return	0 ; 
	} 
	 
	if( dwPos<0 || dwPos > g_dwOtherLibLen-32 )	//输入内码有问题 
	{ 
//		for( i=0 ; i<32 ; i++ ) 
//			sDotBuff[i]	=0xff ;	//返回空 
		g_hpDotBuff	=(BYTE huge*)g_sErrorDotBuff ; 
		return	0 ; 
	} 
         
//	for( i=0 ; i<32 ; i++ ) 
//		sDotBuff[i]	=*( hpOtherLib+dwPos+i ) ; 
	g_hpDotBuff	=g_hpOtherLib+dwPos ; 
	return	1 ; 
} 
 
BOOL HzOut(	HDC hdc , 
			int nX , int nY , 					//Left,upper original point 
			int nWidth , int nHeight , 		//Width and height of the HZ 
			LPCSTR	sHz , int nHzNum , 
			int nOneHzWidth , int nTab , //汉字逻辑宽度与汉字间隔 
			int nOutputCode ) 
{ 
	//一个汉字的宽度为16 
	HDC	memDC	=::CreateCompatibleDC( hdc ) ; 
	HBITMAP	hbm , hOldBitmap ; 
	int	height ; 
	if( GetMapMode( hdc ) == MM_TEXT ) 
		height	=nHeight ; 
	else 
		height	=-nHeight ; 
	COLORREF	oldColor , oldBkColor ; 
	HBRUSH		hBrush , hOldBrush ; 
	DWORD fdwRop ; 
 
	if( GetBkMode( hdc ) != OPAQUE ) 
	{ 
		oldColor	=SetTextColor( hdc , RGB( 0 , 0 , 0 ) ) ; 
		oldBkColor=SetBkColor( hdc , RGB( 255 , 255 , 255 )); 
		 
		hBrush	=CreateSolidBrush( oldColor ) ; 
		hOldBrush	=(HBRUSH)::SelectObject( hdc , hBrush ) ; 
		 
		fdwRop	=0xb8074a ; 
	} 
	else 
		fdwRop	=SRCCOPY ; 
 
	int	i ; 
	BYTE	b1 , b2 ; 
	if( nHeight%2 )	//高度为奇数 
	{ 
//		sDotBuff[32]	=0xff ; 
//		sDotBuff[33]	=0xff ; 
 
		for( i=0 ; i MAX_DOT_NUM ) 
		return	0 ; 
 
	//获得汉字串的点阵 
	int	i , j , k ; 
	int	m , n ;		//每行起始字节数和所余位数 
	for( i=0 ; i>(k%8)) & sDotBuff[j*2+k/8] )	//是1  
					sDotMatrix[m+(n/8)]	&=(~(0x80>>(n%8))) ; 
		} 
	} 
//--------------------------------------------------------------------------// 
 
	HDC	memDC	=::CreateCompatibleDC( hdc ) ; 
     
	//Create a bitmap for the hz 
	HBITMAP	hbm=CreateBitmap( nHzStrWidth , 16 , 1 , 1 , //NULL ) ; 
							(const void FAR*)sDotMatrix ) ; 
	HBITMAP	pOldBitmap	=(HBITMAP)::SelectObject( memDC , hbm ) ; 
 
	int	height ; 
	if( GetMapMode( hdc ) == MM_TEXT ) 
		height	=nHeight ; 
	else 
		height	=-nHeight ; 
			             
	if( GetBkMode( hdc ) == OPAQUE ) 
		::StretchBlt( hdc , nX , nY , nWidth , height , 
								memDC , 0 , 0 , nHzStrWidth , 16 , SRCCOPY ) ; 
	else 
	{ 
		COLORREF	oldColor	=SetTextColor( hdc , RGB( 0 , 0 , 0 ) ) ; 
		COLORREF	oldBkColor=SetBkColor( hdc , RGB( 255 , 255 , 255 )); 
		 
		HBRUSH	hBrush	=CreateSolidBrush( oldColor ) ; 
		HBRUSH	hOldBrush	=(HBRUSH)::SelectObject( hdc , hBrush ) ; 
 
		::StretchBlt( hdc , nX , nY , nWidth , height , 
								memDC , 0 , 0 , nHzStrWidth , 16 , 0xb8074a ) ;	 
 
		SelectObject( hdc , hOldBrush ) ; 
		DeleteObject( hBrush ) ; 
		 
		SetTextColor( hdc , oldColor ) ; 
		SetBkColor( hdc , oldBkColor ) ; 
	} 
 
	SelectObject( memDC , pOldBitmap ) ; 
	DeleteObject( memDC ) ; 
	DeleteObject( hbm ) ; 
		 
	return	1 ; 
} 
 
//初始化cache 
BOOL	InitCache( void ) 
{ 
	BYTE	b1=0xb0 , b2=0xa1 ; 
	p_Cache[0].bCode	=0 ;	//GB 
	p_Cache[0].b1	=b1 ; 
	p_Cache[0].b2	=b2 ; 
	GetDotMatrix( 0 , b1 , b2 ) ; 
	p_Cache[0].hHz	=::CreateBitmap( 16 , 16 , 1 , 1 ,  
										(const void FAR*)sDotBuff ) ; 
	if( !p_Cache[0].hHz ) 
		return	0 ; 
	p_pFirstCache	=&(p_Cache[0]) ; 
	for( int i=1 ; ihHz ) ; 
		p_pFirstCache	=p_pFirstCache->pNext ; 
	} 
} 
 
//得到一个汉字的位图句柄 
HBITMAP	GetOneCache( int bCode , BYTE b1 , BYTE b2 ) 
{ 
	CACHE_ITEM	*pItem ; 
	pItem	=p_pFirstCache ; 
	for( int i=0 ; ibCode && 
			b1==pItem->b1 && b2==pItem->b2 ) 
			return	pItem->hHz ; 
		pItem	=pItem->pNext ; 
	} 
 
	//找不着,以这个汉字冲掉最后一个汉字 
	p_pLastCache->bCode	=bCode ; 
	p_pLastCache->b1	=b1 ; 
	p_pLastCache->b2	=b2 ; 
	DeleteObject( p_pLastCache->hHz ) ;	//删除原来的 
	GetDotMatrix( p_nOutputCode , b1 , b2 ) ; 
	p_pLastCache->hHz	=::CreateBitmap( 16 , 16 , 1 , 1 ,  
										(const void FAR*)sDotBuff ) ; 
 
	p_pFirstCache	=p_pLastCache ; 
	p_pLastCache	=p_pLastCache->pPrior ;	 
	 
	return p_pFirstCache->hHz ; 
} 
*/