HZOUT.CPP
上传用户:zhang8947
上传日期:2007-01-08
资源大小:1910k
文件大小:21k
源码类别:

多国语言处理

开发平台:

Visual C++

  1. #include  "stdafx.h"
  2. #include <windowsx.h>
  3. #include "cspublic.h"
  4. #include "cskernel.h"
  5. #include "hzout.h"
  6. #include "myfunc.h"
  7. static DWORD g_dwHzLibLen=0 ; //汉字库长度
  8. static BYTE huge* g_hpHzLib=NULL ; //汉字库内容
  9. static DWORD g_dwOtherLibLen=0 ; //其它(日文或韩文)库长度
  10. static BYTE huge* g_hpOtherLib=NULL ; //其它(日文或韩文)库内容
  11. //char sDotMatrix[MAX_DOT_NUM*2] ;
  12. //static char  sDotBuff[34] ;
  13. static BYTE huge* g_hpDotBuff ;
  14. static BYTE g_sErrorDotBuff[34]=
  15. {
  16. 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
  17. 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
  18. 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff ,
  19. 0xff , 0xff , 0xff , 0xff } ;
  20. /*
  21. static CACHE_ITEM *p_pFirstCache ; //第一个汉字
  22. static CACHE_ITEM *p_pLastCache ; //最后一个汉字
  23. static CACHE_ITEM p_Cache[CACHE_HZ_NUM] ; //cache
  24. */
  25. //载入显示字库
  26. extern "C" BOOL __export FAR PASCAL LoadZk( void )
  27. {
  28. // if( GetOutputCode()==5 ) //得到缺省输出内码,不需要显示汉字
  29. // return TRUE ;
  30. UnloadZk( 1 ) ;
  31. HFILE hLib ;
  32. //打开汉字显示字库
  33. if( IsJt() ) //汉字输出用简体
  34. hLib =_lopen( (LPCSTR)GBZK16J , READ ) ; //是简体
  35. else
  36. hLib =_lopen( (LPCSTR)GBZK16F , READ ) ; //是繁体
  37. if (hLib == HFILE_ERROR)
  38. {
  39. ::MessageBox( 0 , "没有安装汉字字库,没法显示汉字!" , 0 , MB_OK ) ;
  40. return( FALSE ) ;
  41. }
  42. //分配内存空间
  43. //得到文件长度
  44. g_dwHzLibLen =_llseek( hLib , 0L , 2 ) ;
  45. if( g_dwHzLibLen == HFILE_ERROR )
  46. {
  47. ::MessageBox( 0 , "汉字字库有问题!" , 0 , MB_OK ) ;
  48. return( FALSE ) ;
  49. _llseek( hLib , 0L , 0 ) ; //定位到文件开始处
  50. g_hpHzLib =(BYTE huge*)GlobalAllocPtr( 
  51. GMEM_FIXED , g_dwHzLibLen+2 ) ;
  52. if( !g_hpHzLib )
  53. {
  54. ::MessageBox( 0 , "GlobalAllocPtr is error!" , 0 , MB_OK ) ;
  55. return( FALSE ) ;
  56. }
  57. //读出汉字字库数据
  58. if( _hread( hLib , g_hpHzLib ,  g_dwHzLibLen ) == -1L )
  59. {
  60. ::MessageBox( 0 , "Read Hz Lib error!" , 0 , MB_OK ) ;
  61. GlobalFreePtr( g_hpHzLib ) ;
  62. g_hpHzLib =0 ;
  63. return( FALSE ) ;
  64. }
  65. //关闭汉字字库文件
  66. if( _lclose( hLib ) == HFILE_ERROR )
  67. {
  68. ::MessageBox( 0 , "Close Hz lib error" , 0 , MB_OK ) ;
  69. GlobalFreePtr( g_hpHzLib ) ;
  70. g_hpHzLib =0 ;
  71. return( FALSE ) ;
  72. }
  73. //-----------------------------------------------------------------------------------------------------//
  74. // if( !InitCache() ) //初始化Cache
  75. // return FALSE ;
  76. switch( GetOutputCode() ) //得到缺省输出内码
  77. {
  78. case 0: //GB
  79. case 1: //BIG5
  80. return TRUE ;
  81. case 2: //SHIFT-JIS
  82. case 3: //EUC-JIS
  83. hLib =_lopen( (LPCSTR)JIS16 , READ ) ; //打开日文字库
  84. if (hLib == HFILE_ERROR)
  85. {
  86. ::MessageBox( 0 , "没有安装日文字库,没法显示日文!" , 0 , MB_OK ) ;
  87. return( FALSE ) ;
  88. }
  89. break ;
  90. case 4: //KSC5601
  91. hLib =_lopen( (LPCSTR)KSC16 , READ ) ; //打开韩文字库
  92. if (hLib == HFILE_ERROR)
  93. {
  94. ::MessageBox( 0 , "没有安装韩文字库,没法显示韩文!" , 0 , MB_OK ) ;
  95. return( FALSE ) ;
  96. }
  97. break ;
  98. default:
  99. return FALSE ;
  100. }
  101. //分配空间
  102. //得到文件长度
  103. g_dwOtherLibLen =_llseek( hLib , 0L , 2 ) ;
  104. if( g_dwOtherLibLen == HFILE_ERROR )
  105. {
  106. ::MessageBox( 0 , "日文或韩文字库有问题!" , 0 , MB_OK ) ;
  107. return( FALSE ) ;
  108. _llseek( hLib , 0L , 0 ) ; //定位到文件开始处
  109. g_hpOtherLib =(BYTE huge*)GlobalAllocPtr( 
  110. GMEM_FIXED , g_dwOtherLibLen+2 ) ;
  111. if( !g_hpOtherLib )
  112. {
  113. ::MessageBox( 0 , "GlobalAllocPtr is error!" , 0 , MB_OK ) ;
  114. return( FALSE ) ;
  115. }
  116. //读出日文或韩文字库数据
  117. if( _hread( hLib , g_hpOtherLib ,  g_dwOtherLibLen ) == -1L )
  118. {
  119. ::MessageBox( 0 , "Read JIS or KSC Lib error!" , 0 , MB_OK ) ;
  120. GlobalFreePtr( g_hpOtherLib ) ;
  121. g_hpOtherLib =0 ;
  122. return( FALSE ) ;
  123. }
  124. //关闭日文或韩文字库文件
  125. if( _lclose( hLib ) == HFILE_ERROR )
  126. {
  127. ::MessageBox( 0 , "Close JIS or KSC lib error" , 0 , MB_OK ) ;
  128. GlobalFreePtr( g_hpOtherLib ) ;
  129. g_hpOtherLib =0 ;
  130. return( FALSE ) ;
  131. }
  132. return( TRUE ) ;
  133. }
  134. //卸掉显示字库,bFlag=0,卸掉非中文显示字库,bFlag=1,卸掉所有显示字库
  135. extern "C" void __export FAR PASCAL UnloadZk( BOOL bFlag )
  136. {
  137. if( bFlag )
  138. {
  139. if( g_hpHzLib ) //已经装入汉字字库
  140. {
  141. GlobalFreePtr( g_hpHzLib ) ;
  142. g_hpHzLib =NULL ;
  143. }
  144. }
  145. if( g_hpOtherLib ) //已经装入日文或韩文字库
  146. {
  147. GlobalFreePtr( g_hpOtherLib ) ;
  148. g_hpOtherLib =NULL ;
  149. }
  150. }
  151. //--------------------------------------------------------------//
  152. //显示一行文本
  153. BOOL __export FAR PASCAL TextOutString( 
  154. HDC hdc , int nXStart , int nYStart , 
  155.    LPCSTR lpString , int cbString )
  156. {
  157. TEXTMETRIC textMetric ;
  158. GetTextMetrics( hdc , (TEXTMETRIC FAR*)&textMetric ) ;
  159. int nCharWidth[256] ;
  160. GetCharWidth( hdc , 0 , 255 , (int FAR*)nCharWidth ) ;
  161. int nWidth ;
  162. int nHeight ;
  163. nHeight =textMetric.tmHeight ;
  164. int nHalfHzWidth =nHeight/2 ; //半个汉字宽度
  165. int nOneHzWidth =nHalfHzWidth+nHalfHzWidth ; //一个汉字宽度
  166. int nResult ;
  167. int nNowPos ;
  168. int j ;
  169. for( int i=0 ; i<cbString ; i=nNowPos )
  170. {
  171. //从字符串中提取一汉字串或英文串
  172. nResult =JudgeEnOrHz( i , cbString , lpString , (LPINT)&nNowPos ) ;
  173. if( !nResult ) //字符串已经结束
  174. break ;                                                                                     
  175. if( nResult == 1 ) //是英文串
  176. {
  177. TextOut( hdc , nXStart , nYStart , (LPSTR)(lpString+i) , nNowPos-i ) ;
  178. //计算X轴移动距离
  179. for( j=i ; j<nNowPos ; j++ )
  180. nXStart +=nCharWidth[(BYTE)lpString[j]] ;
  181. }
  182. else //是中文串
  183. {
  184. //计算字符串宽度
  185. nWidth =(nNowPos-i)*nHalfHzWidth ;
  186. //显示汉字串
  187. HzOut( hdc , nXStart , nYStart , 
  188.   nWidth , nHeight , //该汉字串的宽度与高度
  189. lpString+i , (nNowPos-i)/2 , 
  190. nOneHzWidth ,
  191. 0 , 0 ) ; //汉字间隔
  192. //调整位置
  193. nXStart +=nWidth ;
  194. }
  195. }
  196. return( 1 ) ;
  197. }
  198. //输出汉字串
  199. BOOL HzStringOut( HDC hdc , int nXStart , int nYStart ,
  200. const RECT FAR *lprc ,
  201. LPCSTR lpString , int cbString  ,
  202.     int FAR * lpDx , int nOutputCode )
  203. {
  204. TEXTMETRIC textMetric ;
  205. GetTextMetrics( hdc , (TEXTMETRIC FAR*)&textMetric ) ;
  206. UINT uiTextAlign =SetTextAlign( hdc , 
  207. TA_LEFT | TA_TOP | TA_NOUPDATECP ) ;
  208. if( TA_UPDATECP & uiTextAlign )
  209. {
  210. DWORD dwCurrPos =GetCurrentPosition( hdc ) ;
  211. nXStart =LOWORD( dwCurrPos ) ;
  212. nYStart =HIWORD( dwCurrPos ) ;
  213. }
  214. else
  215. {
  216. switch( ( TA_LEFT | TA_CENTER | TA_RIGHT ) & uiTextAlign )
  217. {
  218. // case TA_LEFT:
  219. // nXStart =lprc->left ;
  220. // break ;
  221. case TA_CENTER:
  222. nXStart =( lprc->left + lprc->right )/2 ;
  223. break ;
  224. case TA_RIGHT:
  225. nXStart =lprc->right ;
  226. break ;
  227. }
  228. switch( ( TA_BASELINE | TA_BOTTOM | TA_TOP ) & uiTextAlign )
  229. {
  230. case  TA_BASELINE:
  231. if( GetMapMode( hdc ) == MM_TEXT )
  232. nYStart -=textMetric.tmAscent ;
  233. else
  234. nYStart +=textMetric.tmAscent ;
  235. break ;
  236. case TA_BOTTOM:
  237. nYStart =lprc->bottom-textMetric.tmHeight ;
  238. break ;
  239. // case TA_TOP:
  240. // nYStart =lprc->top ;
  241. // break ;
  242. }
  243. }
  244. //------------------------------------------------------------------------//
  245. int nCharWidth[256] ;
  246. GetCharWidth( hdc , 0 , 255 , (int FAR*)nCharWidth ) ;
  247. int nWidth ;
  248. int nHeight ;//=textMetric.tmHeight ;
  249. nHeight =textMetric.tmHeight ;
  250. int nCharExtra =GetTextCharacterExtra( hdc) ;
  251. int nResult ;
  252. int nNowPos ;
  253. int j ;
  254. for( int i=0 ; i<cbString ; i=nNowPos )
  255. {
  256. //从字符串中提取一汉字串或英文串
  257. nResult =JudgeEnOrHz( i , cbString , lpString , (LPINT)&nNowPos ) ;
  258. if( !nResult ) //字符串已经结束
  259. break ;
  260. if( nResult == 1 ) //是英文串
  261. {
  262. TextOut( hdc , nXStart , nYStart , lpString+i , nNowPos-i ) ;
  263. //计算X轴移动距离                                        
  264. for( j=i ; j<nNowPos ; j++ )
  265. if( lpDx )
  266. nXStart +=lpDx[j] ;
  267. else
  268. nXStart +=nCharWidth[(BYTE)lpString[j]]+nCharExtra ;
  269. }
  270. else //是中文串
  271. {
  272. //计算字符串宽度
  273. nWidth =0 ;
  274. for( j=i ; j<nNowPos ; j++ )
  275. if( lpDx )
  276. nWidth +=lpDx[j] ;
  277. else
  278. nWidth +=nCharWidth[(BYTE)lpString[j]]+nCharExtra ;
  279. //显示汉字串
  280. HzOut( hdc , nXStart , nYStart , 
  281.   nWidth , nHeight , //该汉字串的宽度与高度
  282. lpString+i , (nNowPos-i)/2 , 
  283. nCharWidth[(BYTE)lpString[i]]+
  284.   nCharWidth[(BYTE)lpString[i+1]]+
  285.   nCharExtra , //一个汉字宽度
  286. nCharExtra , nOutputCode ) ; //汉字间隔
  287. //调整位置
  288. nXStart +=nWidth ;
  289. }
  290. }
  291. if( TA_UPDATECP & uiTextAlign )
  292. MoveTo( hdc , nXStart , nYStart ) ;
  293. SetTextAlign( hdc , uiTextAlign ) ;
  294. return( 1 ) ;
  295. }
  296. //输出汉字串,对应于ExtTextOut
  297. BOOL ExtHzStringOut( 
  298.    HDC hdc , int nXStart , int nYStart , 
  299.    UINT fuOptions , const RECT FAR *lprc ,
  300.    LPCSTR lpString , int cbString ,
  301.    int FAR * lpDx , int nOutputCode )
  302. {
  303. if( lprc )
  304. {
  305. //设置载剪区
  306. /* if( fuOptions == ETO_CLIPPED ||
  307.  fuOptions == ( ETO_CLIPPED | ETO_OPAQUE ) )
  308. {
  309. RECT lprc1=*lprc ;
  310. LPtoDP( hdc , (POINT FAR*)&lprc1 , 2 ) ;
  311. HRGN hrgn=CreateRectRgn( lprc1.left , lprc1.top , 
  312. lprc1.right , lprc1.bottom ) ;
  313.        SelectClipRgn( hdc , hrgn ) ;
  314.        DeleteObject( hrgn ) ;
  315.        }
  316. */      
  317.        //以当前背景颜色进行填充
  318. if( fuOptions == ETO_OPAQUE || 
  319.  fuOptions == ( ETO_OPAQUE | ETO_CLIPPED ) )
  320. {
  321. HBRUSH hBrush=::CreateSolidBrush( GetBkColor( hdc ) ) ;
  322. FillRect( hdc , lprc , hBrush ) ;
  323. ::DeleteObject( hBrush ) ;
  324. }
  325. }
  326. if( !lprc )
  327. {
  328. DWORD dwTextExtent =GetTextExtent( hdc , lpString , cbString ) ;                        
  329. RECT rect={ nXStart , nYStart , 
  330. nXStart+LOWORD( dwTextExtent ) -1 , nYStart } ;
  331. if( GetMapMode( hdc ) == MM_TEXT )
  332. rect.bottom +=HIWORD( dwTextExtent )-1 ;
  333. else
  334. rect.bottom -=(HIWORD( dwTextExtent )-1) ;  
  335. HzStringOut(  hdc , nXStart , nYStart , 
  336. (RECT FAR*)&rect ,
  337. lpString , cbString , (LPINT)lpDx , nOutputCode ) ;
  338. }
  339.     else
  340. HzStringOut(  hdc , nXStart , nYStart , 
  341. lprc ,
  342. lpString , cbString , (LPINT)lpDx , nOutputCode ) ;
  343. /* if( lprc &&
  344. ( fuOptions == ETO_CLIPPED ||
  345.  fuOptions == ( ETO_CLIPPED | ETO_OPAQUE ) ) )
  346. SelectClipRgn( hdc , NULL ) ;
  347. */
  348. return( 1 ) ;
  349. }    
  350. //得到一个字库的16点阵
  351. BOOL GetDotMatrix(
  352. BYTE bAreaNum , BYTE bPosNum , int nOutputCode )
  353. {
  354. DWORD dwPos ; //该字在字库中的偏移量
  355. // BYTE bAreaNum =(BYTE)sHz[0] ; //区号
  356. // BYTE bPosNum =(BYTE)sHz[1] ; //位号
  357. // int i ;
  358. switch( nOutputCode ) //判断输出内码
  359. {
  360. case 0: //GB
  361. case 1: //BIG5
  362. // if ( bAreaNum < 0xB0 ) //1-9区,是中文字符区
  363. dwPos=( ( bAreaNum-0XA1)*94L+bPosNum-0XA1 )*32L ;
  364. //    else //846=9*94 //16-87区,是汉字区
  365. //        dwPos=( ( bAreaNum-0XB0)*94L+bPosNum-0XA1+846L )*32L ;
  366. if( dwPos<0 || dwPos > g_dwHzLibLen-32 ) //输入内码有问题
  367. {
  368. // for( i=0 ; i<32 ; i++ )
  369. // sDotBuff[i] =0 ; //返回空
  370. g_hpDotBuff =(BYTE huge*)g_sErrorDotBuff ;
  371. return 0 ;
  372. }
  373.         
  374. // for( i=0 ; i<32 ; i++ )
  375. // sDotBuff[i] =~(*( hpHzLib+dwPos+i )) ;
  376. g_hpDotBuff =g_hpHzLib+dwPos ;
  377. return 1 ;
  378. case 2: //SHIFT-JIS
  379. if( bPosNum == 0x7f )
  380. {
  381. // for( int j=0 ; j<32 ; j++ )
  382. // sDotBuff[j] =0xff ;
  383. g_hpDotBuff =(BYTE huge*)g_sErrorDotBuff ;
  384. return 0 ;
  385. }
  386. if( bPosNum > 0x7f )
  387. bPosNum-- ;
  388. if( (bAreaNum>=0x81 && bAreaNum<0x88) ||
  389. (bAreaNum==0x88 && bPosNum<0x9e) )
  390. dwPos =( ( bAreaNum-0x81 )*188L+bPosNum-0x40 )*32L ;
  391. else if( (bAreaNum>0x88 && bAreaNum<=0x9f ) ||
  392.  (bAreaNum==0x88 && bPosNum>=0x9e ) )
  393. dwPos =( ( bAreaNum-0x81-2 )*188L+bPosNum-0x40-0x5e )*32L ;
  394. else if( (bAreaNum>=0xe0 && bAreaNum<0xea) ||
  395.  (bAreaNum==0xea && bPosNum<=0xa1 ) )
  396. dwPos =( ( bAreaNum-0xe0-2 )*188L+bPosNum-0x40L-0x5eL+5828L )*32L ;
  397. else
  398. {
  399. // for( int j=0 ; j<32 ; j++ )
  400. // sDotBuff[j] =0xff ;
  401. g_hpDotBuff =(BYTE huge*)g_sErrorDotBuff ;
  402. return 0 ;
  403. }
  404. break ;
  405. case 3: //EUC-JIS
  406. if( bAreaNum<0xb0 )
  407. dwPos =((bAreaNum-0xa1)*94L+bPosNum-0xa1)*32L ;
  408. else
  409. dwPos =((bAreaNum-0xb0)*94L+bPosNum-0xa1+940L)*32L ;
  410. break ;
  411. case 4: //KSC5601
  412. if( bAreaNum<0xb0 )
  413. dwPos =((bAreaNum-0xa1)*94L+bPosNum-0xa1)*32L ;
  414. else
  415. dwPos =((bAreaNum-0xb0)*94L+bPosNum-0xa1+1128L)*32L ;
  416. break ;
  417. default:
  418. g_hpDotBuff =(BYTE huge*)g_sErrorDotBuff ;
  419. return 0 ;
  420. }
  421. if( dwPos<0 || dwPos > g_dwOtherLibLen-32 ) //输入内码有问题
  422. {
  423. // for( i=0 ; i<32 ; i++ )
  424. // sDotBuff[i] =0xff ; //返回空
  425. g_hpDotBuff =(BYTE huge*)g_sErrorDotBuff ;
  426. return 0 ;
  427. }
  428.         
  429. // for( i=0 ; i<32 ; i++ )
  430. // sDotBuff[i] =*( hpOtherLib+dwPos+i ) ;
  431. g_hpDotBuff =g_hpOtherLib+dwPos ;
  432. return 1 ;
  433. }
  434. BOOL HzOut( HDC hdc ,
  435. int nX , int nY ,  //Left,upper original point
  436. int nWidth , int nHeight ,  //Width and height of the HZ
  437. LPCSTR sHz , int nHzNum ,
  438. int nOneHzWidth , int nTab , //汉字逻辑宽度与汉字间隔
  439. int nOutputCode )
  440. {
  441. //一个汉字的宽度为16
  442. HDC memDC =::CreateCompatibleDC( hdc ) ;
  443. HBITMAP hbm , hOldBitmap ;
  444. int height ;
  445. if( GetMapMode( hdc ) == MM_TEXT )
  446. height =nHeight ;
  447. else
  448. height =-nHeight ;
  449. COLORREF oldColor , oldBkColor ;
  450. HBRUSH hBrush , hOldBrush ;
  451. DWORD fdwRop ;
  452. if( GetBkMode( hdc ) != OPAQUE )
  453. {
  454. oldColor =SetTextColor( hdc , RGB( 0 , 0 , 0 ) ) ;
  455. oldBkColor=SetBkColor( hdc , RGB( 255 , 255 , 255 ));
  456. hBrush =CreateSolidBrush( oldColor ) ;
  457. hOldBrush =(HBRUSH)::SelectObject( hdc , hBrush ) ;
  458. fdwRop =0xb8074a ;
  459. }
  460. else
  461. fdwRop =SRCCOPY ;
  462. int i ;
  463. BYTE b1 , b2 ;
  464. if( nHeight%2 ) //高度为奇数
  465. {
  466. // sDotBuff[32] =0xff ;
  467. // sDotBuff[33] =0xff ;
  468. for( i=0 ; i<nHzNum ; i++ )
  469. {
  470. GetDotMatrix( (BYTE)sHz[i*2] , (BYTE)sHz[i*2+1] , nOutputCode ) ;
  471. //保存原来两字节内容
  472. b1 =*(g_hpDotBuff+32) ;
  473. b2 =*(g_hpDotBuff+33) ;
  474. *(g_hpDotBuff+32) =0xff ;
  475. *(g_hpDotBuff+33) =0xff ;
  476. hbm =::CreateBitmap( 16 , 17 , 1 , 1 , g_hpDotBuff ) ;
  477. hOldBitmap =(HBITMAP)::SelectObject( memDC , hbm ) ;
  478. ::StretchBlt( hdc , nX , nY , nOneHzWidth , height ,
  479. memDC , 0 , 0 , 16 , 17 , fdwRop ) ;
  480. ::SelectObject( memDC , hOldBitmap ) ;
  481. ::DeleteObject( hbm ) ;
  482. //恢复原来两字节内容
  483. *(g_hpDotBuff+32) =b1 ;
  484. *(g_hpDotBuff+33) =b2 ;
  485. nX +=nOneHzWidth+nTab ;
  486. }
  487. }
  488. else
  489. {
  490. for( i=0 ; i<nHzNum ; i++ )
  491. {
  492. GetDotMatrix( (BYTE)sHz[i*2] , (BYTE)sHz[i*2+1] , nOutputCode ) ;
  493. hbm =::CreateBitmap( 16 , 16 , 1 , 1 , g_hpDotBuff ) ;
  494. hOldBitmap =(HBITMAP)::SelectObject( memDC , hbm ) ;
  495. ::StretchBlt( hdc , nX , nY , nOneHzWidth , height ,
  496. memDC , 0 , 0 , 16 , 16 , fdwRop ) ;
  497. ::SelectObject( memDC , hOldBitmap ) ;
  498. ::DeleteObject( hbm ) ;
  499. nX +=nOneHzWidth+nTab ;
  500. }
  501. }
  502. if( GetBkMode( hdc ) != OPAQUE )
  503. {
  504. SelectObject( hdc , hOldBrush ) ;
  505. DeleteObject( hBrush ) ;
  506. SetTextColor( hdc , oldColor ) ;
  507. SetBkColor( hdc , oldBkColor ) ;
  508. }
  509. DeleteObject( memDC ) ;
  510. return 1 ;
  511. }
  512. /*
  513. //显示一个汉字或日文或韩文,nx,ny,nWidth,nHeight都用的是logical unit
  514. BOOL HzOut( HDC hdc ,
  515. int nX , int nY ,  //Left,upper original point
  516. int nWidth , int nHeight ,  //Width and height of the HZ
  517. LPCSTR sHz , int nHzNum ,
  518. int nOneHzWidth , int nTab ) //汉字逻辑宽度与汉字间隔
  519. {
  520. //一个汉字的宽度为16
  521. HDC memDC =::CreateCompatibleDC( hdc ) ;
  522. HBITMAP hbm , hOldBitmap ;
  523. int height ;
  524. if( GetMapMode( hdc ) == MM_TEXT )
  525. height =nHeight ;
  526. else
  527. height =-nHeight ;
  528. COLORREF oldColor , oldBkColor ;
  529. HBRUSH hBrush , hOldBrush ;
  530. DWORD fdwRop ;
  531. if( GetBkMode( hdc ) != OPAQUE )
  532. {
  533. oldColor =SetTextColor( hdc , RGB( 0 , 0 , 0 ) ) ;
  534. oldBkColor=SetBkColor( hdc , RGB( 255 , 255 , 255 ));
  535. hBrush =CreateSolidBrush( oldColor ) ;
  536. hOldBrush =(HBRUSH)::SelectObject( hdc , hBrush ) ;
  537. fdwRop =0xb8074a ;
  538. }
  539. else
  540. fdwRop =SRCCOPY ;
  541. int nCode ;
  542. if( p_nOutputCode==1 ) //判断输出内码为BIG5
  543. nCode =0 ;
  544. else
  545. nCode =p_nOutputCode ;
  546. for( int i=0 ; i<nHzNum ; i++ )
  547. {
  548. hbm =GetOneCache( nCode , (BYTE)sHz[i*2] , (BYTE)sHz[i*2+1] ) ;
  549. if( !i ) //第一个汉字
  550. hOldBitmap =(HBITMAP)::SelectObject( memDC , hbm ) ;
  551. else
  552. (HBITMAP)::SelectObject( memDC , hbm ) ;
  553. ::StretchBlt( hdc , nX , nY , nOneHzWidth , height ,
  554. memDC , 0 , 0 , 16 , 16 , fdwRop ) ;
  555. nX +=nOneHzWidth+nTab ;
  556. }
  557. if( GetBkMode( hdc ) != OPAQUE )
  558. {
  559. SelectObject( hdc , hOldBrush ) ;
  560. DeleteObject( hBrush ) ;
  561. SetTextColor( hdc , oldColor ) ;
  562. SetBkColor( hdc , oldBkColor ) ;
  563. }
  564. SelectObject( memDC , hOldBitmap ) ;
  565. DeleteObject( memDC ) ;
  566. return 1 ;
  567. }
  568. BOOL HzOut( HDC hdc ,
  569. int nX , int nY ,  //Left,upper original point
  570. int nWidth , int nHeight ,  //Width and height of the HZ
  571. LPCSTR sHz , int nHzNum ,
  572. int nOneHzWidth , int nTab ) //汉字逻辑宽度与汉字间隔
  573. {
  574. // if( nHzNum<=0 || nOneHzWidth<=0 || nTab <0 )
  575. // return 0 ;
  576. //一个汉字的宽度为16
  577. int nHzTab =(16*nTab)/nOneHzWidth ; //转换汉字间隔
  578. int nHzWidth =16 + nHzTab ; //一个汉字的宽度
  579. int nHzStrWidth =nHzWidth*nHzNum ; //汉字串的宽度
  580. if( nHzStrWidth > MAX_DOT_NUM )
  581. return 0 ;
  582. //获得汉字串的点阵
  583. int i , j , k ;
  584. int m , n ; //每行起始字节数和所余位数
  585. for( i=0 ; i<nHzStrWidth+nHzStrWidth ; i++ )
  586. sDotMatrix[i] =0xff ;
  587. for( i=0 ; i<nHzNum ; i++ ) //nHzNum个汉字
  588. {
  589. //Get the dot matrix of the hz.
  590. GetDotMatrix( sHz+i*2 , sHz+i*2+1 ) ;
  591. //将这个字的点阵分布到汉字串中
  592. for( j=0 ; j<16 ; j++ ) //一共是16行,每行两个字节
  593. {
  594. m =(j*nHzStrWidth+i*nHzWidth)/8 ; //起始字节
  595. //起始字节中已用过的位数
  596. n =(j*nHzStrWidth+i*nHzWidth)%8 ;
  597. for( k=0 ; k<16 ; k++ , n++ ) //每行16列,即16个象素
  598. if( (0x80>>(k%8)) & sDotBuff[j*2+k/8] ) //是1 
  599. sDotMatrix[m+(n/8)] &=(~(0x80>>(n%8))) ;
  600. }
  601. }
  602. //--------------------------------------------------------------------------//
  603. HDC memDC =::CreateCompatibleDC( hdc ) ;
  604.     
  605. //Create a bitmap for the hz
  606. HBITMAP hbm=CreateBitmap( nHzStrWidth , 16 , 1 , 1 , //NULL ) ;
  607. (const void FAR*)sDotMatrix ) ;
  608. HBITMAP pOldBitmap =(HBITMAP)::SelectObject( memDC , hbm ) ;
  609. int height ;
  610. if( GetMapMode( hdc ) == MM_TEXT )
  611. height =nHeight ;
  612. else
  613. height =-nHeight ;
  614.             
  615. if( GetBkMode( hdc ) == OPAQUE )
  616. ::StretchBlt( hdc , nX , nY , nWidth , height ,
  617. memDC , 0 , 0 , nHzStrWidth , 16 , SRCCOPY ) ;
  618. else
  619. {
  620. COLORREF oldColor =SetTextColor( hdc , RGB( 0 , 0 , 0 ) ) ;
  621. COLORREF oldBkColor=SetBkColor( hdc , RGB( 255 , 255 , 255 ));
  622. HBRUSH hBrush =CreateSolidBrush( oldColor ) ;
  623. HBRUSH hOldBrush =(HBRUSH)::SelectObject( hdc , hBrush ) ;
  624. ::StretchBlt( hdc , nX , nY , nWidth , height ,
  625. memDC , 0 , 0 , nHzStrWidth , 16 , 0xb8074a ) ;
  626. SelectObject( hdc , hOldBrush ) ;
  627. DeleteObject( hBrush ) ;
  628. SetTextColor( hdc , oldColor ) ;
  629. SetBkColor( hdc , oldBkColor ) ;
  630. }
  631. SelectObject( memDC , pOldBitmap ) ;
  632. DeleteObject( memDC ) ;
  633. DeleteObject( hbm ) ;
  634. return 1 ;
  635. }
  636. //初始化cache
  637. BOOL InitCache( void )
  638. {
  639. BYTE b1=0xb0 , b2=0xa1 ;
  640. p_Cache[0].bCode =0 ; //GB
  641. p_Cache[0].b1 =b1 ;
  642. p_Cache[0].b2 =b2 ;
  643. GetDotMatrix( 0 , b1 , b2 ) ;
  644. p_Cache[0].hHz =::CreateBitmap( 16 , 16 , 1 , 1 , 
  645. (const void FAR*)sDotBuff ) ;
  646. if( !p_Cache[0].hHz )
  647. return 0 ;
  648. p_pFirstCache =&(p_Cache[0]) ;
  649. for( int i=1 ; i<CACHE_HZ_NUM ; i++ )
  650. {
  651. if( b2==0xfe )
  652. {
  653. b1++ ;
  654. b2 =0xa1 ;
  655. }
  656. else
  657. b2++ ;
  658. p_Cache[i].bCode =0 ;
  659. p_Cache[i].b1 =b1 ;
  660. p_Cache[i].b2 =b2 ;
  661. GetDotMatrix( 0 , b1 , b2 ) ;
  662. p_Cache[i].hHz =::CreateBitmap( 16 , 16 , 1 , 1 , 
  663. (const void FAR*)sDotBuff ) ;
  664. if( !p_Cache[i].hHz )
  665. return 0 ;
  666. p_Cache[i].pPrior =&(p_Cache[i-1]) ;
  667. p_Cache[i-1].pNext =&(p_Cache[i]) ;
  668. }
  669. p_pLastCache =&(p_Cache[CACHE_HZ_NUM-1]) ;
  670. p_Cache[CACHE_HZ_NUM-1].pNext =p_pFirstCache ;
  671. p_Cache[0].pPrior =p_pLastCache ;
  672. return 1 ;
  673. }
  674. //结束Cache
  675. void ExitCache( void )
  676. {
  677. for( int i=0 ; i<CACHE_HZ_NUM ; i++ )
  678. {
  679. DeleteObject( p_pFirstCache->hHz ) ;
  680. p_pFirstCache =p_pFirstCache->pNext ;
  681. }
  682. }
  683. //得到一个汉字的位图句柄
  684. HBITMAP GetOneCache( int bCode , BYTE b1 , BYTE b2 )
  685. {
  686. CACHE_ITEM *pItem ;
  687. pItem =p_pFirstCache ;
  688. for( int i=0 ; i<CACHE_HZ_NUM ; i++ )
  689. {
  690. if( bCode==pItem->bCode &&
  691. b1==pItem->b1 && b2==pItem->b2 )
  692. return pItem->hHz ;
  693. pItem =pItem->pNext ;
  694. }
  695. //找不着,以这个汉字冲掉最后一个汉字
  696. p_pLastCache->bCode =bCode ;
  697. p_pLastCache->b1 =b1 ;
  698. p_pLastCache->b2 =b2 ;
  699. DeleteObject( p_pLastCache->hHz ) ; //删除原来的
  700. GetDotMatrix( p_nOutputCode , b1 , b2 ) ;
  701. p_pLastCache->hHz =::CreateBitmap( 16 , 16 , 1 , 1 , 
  702. (const void FAR*)sDotBuff ) ;
  703. p_pFirstCache =p_pLastCache ;
  704. p_pLastCache =p_pLastCache->pPrior ;
  705. return p_pFirstCache->hHz ;
  706. }
  707. */