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 ; i 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 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 ; i hHz ) ; p_pFirstCache =p_pFirstCache->pNext ; } } //得到一个汉字的位图句柄 HBITMAP GetOneCache( int bCode , BYTE b1 , BYTE b2 ) { CACHE_ITEM *pItem ; pItem =p_pFirstCache ; for( int i=0 ; i bCode && 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 ; } */