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

📄 hzout.cpp

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

#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 ; i<cbString ; i=nNowPos )
	{
		//从字符串中提取一汉字串或英文串
		nResult	=JudgeEnOrHz( i , cbString , lpString , (LPINT)&nNowPos ) ;
		if( !nResult )		//字符串已经结束
			break ;                                                                                     
		if( nResult == 1 )	//是英文串
		{
			TextOut( hdc , nXStart , nYStart , (LPSTR)(lpString+i) , nNowPos-i ) ;
			//计算X轴移动距离
			for( j=i ; j<nNowPos ; j++ )
				nXStart	+=nCharWidth[(BYTE)lpString[j]] ;
		}
		else	//是中文串
		{
			//计算字符串宽度
			nWidth	=(nNowPos-i)*nHalfHzWidth ;
			
			//显示汉字串
			HzOut( hdc , nXStart , nYStart , 
					 	nWidth , nHeight ,		//该汉字串的宽度与高度
						lpString+i , (nNowPos-i)/2 , 
						nOneHzWidth ,
						0 , 0 ) ;	//汉字间隔
			//调整位置
			nXStart	+=nWidth ;						
		}
	}

	return( 1 ) ;
}

//输出汉字串
BOOL HzStringOut( HDC hdc , int nXStart , int nYStart ,
						const RECT FAR *lprc ,
						LPCSTR lpString , int cbString  ,
					   	int FAR * lpDx , int nOutputCode )
{
	TEXTMETRIC	textMetric ;
	GetTextMetrics( hdc , (TEXTMETRIC FAR*)&textMetric ) ;
	
	UINT	uiTextAlign	=SetTextAlign( hdc , 
										TA_LEFT | TA_TOP | TA_NOUPDATECP ) ;
	if( TA_UPDATECP & uiTextAlign )
	{
		DWORD	dwCurrPos	=GetCurrentPosition( hdc ) ;										
		nXStart	=LOWORD( dwCurrPos ) ;
		nYStart	=HIWORD( dwCurrPos ) ;
	}
	else
	{
		switch( ( TA_LEFT | TA_CENTER | TA_RIGHT ) & uiTextAlign )
		{
//			case	TA_LEFT:
//				nXStart	=lprc->left ;
//				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<cbString ; i=nNowPos )
	{
		//从字符串中提取一汉字串或英文串
		nResult	=JudgeEnOrHz( i , cbString , lpString , (LPINT)&nNowPos ) ;
		if( !nResult )		//字符串已经结束
			break ;
		if( nResult == 1 )	//是英文串
		{
			TextOut( hdc , nXStart , nYStart , lpString+i , nNowPos-i ) ;
			//计算X轴移动距离                                        
			for( j=i ; j<nNowPos ; j++ )
				if( lpDx )
					nXStart	+=lpDx[j] ;
				else
					nXStart	+=nCharWidth[(BYTE)lpString[j]]+nCharExtra ;
		}
		else	//是中文串
		{
			//计算字符串宽度
			nWidth	=0 ;
			for( j=i ; j<nNowPos ; j++ )
				if( lpDx )
					nWidth	+=lpDx[j] ;
				else
					nWidth	+=nCharWidth[(BYTE)lpString[j]]+nCharExtra ;
			
			//显示汉字串
			HzOut( hdc , nXStart , nYStart , 
					 	nWidth , nHeight ,		//该汉字串的宽度与高度
						lpString+i , (nNowPos-i)/2 , 
						nCharWidth[(BYTE)lpString[i]]+
				 		nCharWidth[(BYTE)lpString[i+1]]+
				 		nCharExtra ,	//一个汉字宽度
						nCharExtra , nOutputCode ) ;	//汉字间隔
			//调整位置
			nXStart	+=nWidth ;						
		}
	}

	if( TA_UPDATECP & uiTextAlign )
		MoveTo( hdc , nXStart , nYStart ) ;
	SetTextAlign( hdc , uiTextAlign ) ;
	
	return( 1 ) ;
}

//输出汉字串,对应于ExtTextOut
BOOL ExtHzStringOut( 
				   HDC hdc , int nXStart , int nYStart , 
				   UINT fuOptions , const RECT FAR *lprc ,
				   LPCSTR lpString , int cbString ,
				   int FAR * lpDx , int nOutputCode )
{
	if( lprc )
	{
		//设置载剪区
/*		if( fuOptions == ETO_CLIPPED ||
			 fuOptions == ( ETO_CLIPPED | ETO_OPAQUE ) )
		{
			RECT	lprc1=*lprc ;
			LPtoDP( hdc , (POINT FAR*)&lprc1 , 2 ) ;
			HRGN	hrgn=CreateRectRgn( lprc1.left , lprc1.top , 
													lprc1.right , lprc1.bottom ) ;

      		SelectClipRgn( hdc , hrgn ) ;

      		DeleteObject( hrgn ) ;
      	}
*/      	
      	//以当前背景颜色进行填充	
		if( fuOptions == ETO_OPAQUE || 
			 fuOptions == ( ETO_OPAQUE | ETO_CLIPPED ) )
		{
			HBRUSH hBrush=::CreateSolidBrush( GetBkColor( hdc ) ) ;
			FillRect( hdc , lprc , hBrush ) ;
			::DeleteObject( hBrush ) ;
		}
	}
	
	if( !lprc )
	{
		DWORD	dwTextExtent	=GetTextExtent( hdc , lpString , cbString ) ;                        
		RECT	rect={ nXStart , nYStart , 
					nXStart+LOWORD( dwTextExtent ) -1 , nYStart } ;
		if( GetMapMode( hdc	) == MM_TEXT )
			rect.bottom	+=HIWORD( dwTextExtent )-1 ;
		else
			rect.bottom	-=(HIWORD( dwTextExtent )-1) ;						 

		HzStringOut( 	hdc , nXStart , nYStart , 
						(RECT FAR*)&rect ,
						lpString , cbString , (LPINT)lpDx , nOutputCode ) ;
	}
    else
		HzStringOut( 	hdc , nXStart , nYStart , 
						lprc ,
						lpString , cbString , (LPINT)lpDx , nOutputCode ) ;

/*	if( lprc &&
		( fuOptions == ETO_CLIPPED ||
			 fuOptions == ( ETO_CLIPPED | ETO_OPAQUE ) ) )
		SelectClipRgn( hdc , NULL ) ;
*/		
	return( 1 ) ;
}				   

//得到一个字库的16点阵
BOOL	GetDotMatrix(
	BYTE bAreaNum , BYTE bPosNum , int nOutputCode )
{
	DWORD	dwPos ;	//该字在字库中的偏移量
//	BYTE		bAreaNum	=(BYTE)sHz[0] ;	//区号
//	BYTE		bPosNum		=(BYTE)sHz[1] ;	//位号
//	int		i ;

⌨️ 快捷键说明

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