📄 hzout.cpp
字号:
#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 + -