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

多国语言处理

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <windowsx.h>
  3. #include "cspublic.h"
  4. #include "tools.h"
  5. //把BIG5转换成GB的对象
  6. CChangeCode p_Big5ToGb( BIG5TOGB_LIB_NAME ) ;
  7. //把GB转换成BIG5的对象
  8. CChangeCode p_GbToBig5( GBTOBIG5_LIB_NAME ) ;
  9. //--------------------------------------------------------------------------------------------//
  10. //将内码从BIG5转换成GB码或GB到BIG5
  11. CChangeCode::CChangeCode( char * psFileName ):
  12.  CFile( psFileName , CFile::modeRead )
  13. {
  14. DWORD dwFileLen =GetLength() ; //得到文件长度
  15. if( dwFileLen % 4  ) //不能被4整除
  16. {
  17. ::MessageBox( 0 , "The length of the file is wrong!" , 0 , MB_OK ) ;
  18. return ;
  19. }
  20. m_nItemNum =(int)(dwFileLen / 4) ; //表中项数
  21. //分配内存
  22. m_lpsList =(char huge*)GlobalAllocPtr( GMEM_FIXED ,
  23. dwFileLen ) ;
  24. if( !m_lpsList )
  25. {
  26. ::MessageBox( 0 , "GlobalAllocPtr error" , 0 , MB_OK ) ;
  27. return ;
  28. }
  29. //读出内码转换表
  30. ReadHuge( m_lpsList , dwFileLen ) ;
  31. Close() ;
  32. }  
  33. CChangeCode::~CChangeCode( void )
  34. {
  35. if( m_lpsList )
  36. GlobalFreePtr( m_lpsList ) ;
  37. }
  38. //改变一个汉字的内码
  39. void  CChangeCode::ChangeOneHzCode( LPSTR lpsHz )
  40. {
  41. LONG nFirst =0 ; //表头
  42. LONG nLast =m_nItemNum-1 ; //表尾
  43. LONG nMiddle ;
  44. LONG nPoint ;                               //在表中的字节偏移量
  45. int n ;
  46. while( nFirst <= nLast )
  47. {
  48. nMiddle =( nFirst + nLast ) / 2; //二分
  49. nPoint =nMiddle*4 ;
  50. n =_fstrncmp( m_lpsList+nPoint , lpsHz , 2 ) ; //比较
  51. if( !n ) //两者内码相同
  52. {
  53. //进行转换
  54. lpsHz[0] =m_lpsList[nPoint+2] ;
  55. lpsHz[1] =m_lpsList[nPoint+3] ;
  56. return ;
  57. }
  58. if( n<0 )
  59. nFirst =nMiddle+1 ;
  60. else
  61. nLast =nMiddle-1 ;
  62. }
  63. //表中没有该汉字内码,返回确省GB内码,即空格
  64. lpsHz[0] =0xa1 ;
  65. lpsHz[1] =0xa1 ;
  66. }
  67. #ifdef __cplusplus
  68. extern "C" {
  69. #endif
  70. //发送汉字
  71. #define WM_IME_CHAR 0x0286
  72. #define WM_IME_REPORT 0x0280
  73. BOOL __export FAR PASCAL SendHz( LPCSTR szResult )
  74. {
  75. int nLen =_fstrlen( szResult ) ;
  76.     HWND hWnd =::GetFocus();
  77.     if( !hWnd )
  78. hWnd =GetFocus32() ;
  79. if( !hWnd ) //没有输入窗口
  80. return FALSE ;
  81. int i ;
  82. //低字0为Win,1为95;高字0为西文,1为外挂,2为中文Win
  83. DWORD dwVersion =GetWindowsVersion() ;
  84. if( LOWORD(dwVersion) && HIWORD(dwVersion)==2 ) //为中文96
  85. {
  86. char szTmp[3] ;
  87.      szTmp[2] ='' ;
  88. for( i=0; i<nLen; i+=2) 
  89.         {
  90.      if( !GetInputStatus123(2) ) //需要在汉字前加空格
  91. ::SendMessage( hWnd , WM_CHAR , ' ' , 0 ) ;
  92.     szTmp[0] = szResult[i+1];
  93.     szTmp[1] = szResult[i];
  94.     ::SendMessage(hWnd, WM_IME_REPORT,  
  95.                *((WPARAM*)szTmp), 0 );
  96.             ::SendMessage(hWnd, WM_IME_CHAR,  
  97.               *((WPARAM*)szTmp), 1);
  98. }
  99.     }   
  100. else
  101. {
  102. for( i=0 ; i<nLen ; i++ )
  103.        {
  104.        if( !(i%2) && !GetInputStatus123(2) ) //需要在汉字前加空格
  105. ::SendMessage( hWnd , WM_CHAR , ' ' , 0 ) ;      
  106. ::SendMessage( hWnd , WM_CHAR , (BYTE)szResult[i] , 0 ) ;
  107. }
  108. ::InvalidateRect( hWnd , NULL , FALSE ) ;
  109. ::UpdateWindow( hWnd ) ;
  110. }
  111.     return TRUE ;
  112. }
  113. //提取字符串中的汉字串或英文串
  114. int __export FAR PASCAL JudgeEnOrHz( int nStartPos , int cbString , LPCSTR lpszString , 
  115.  int FAR *lpNowPos ) 
  116. {
  117. if( nStartPos < 0 || nStartPos >= cbString )
  118. return 0 ;
  119. if( nStartPos == cbString-1 )
  120. {
  121. *lpNowPos =cbString ;
  122. return 1 ;
  123. }
  124. int nStatus ;
  125. if( lpszString[nStartPos] & 0x80 )
  126. nStatus =2 ;
  127. else
  128. nStatus =1 ;
  129. for( int i=nStartPos ; i<cbString ; )
  130. {
  131. if( i == cbString-1 )
  132. {
  133. if( nStatus == 2 )
  134. {
  135. *lpNowPos =i ;
  136. return 2 ;
  137. }
  138. else
  139. {
  140. *lpNowPos =cbString ;
  141. return 1 ;
  142. }
  143. }
  144. if( lpszString[i]&0x80 )
  145. {
  146. if( nStatus == 1 )
  147. {
  148. *lpNowPos =i ;
  149. return( 1 ) ;
  150. }
  151. i +=2 ;
  152. }
  153. else
  154. {
  155. if( nStatus == 2 )
  156. {
  157. *lpNowPos =i ;
  158. return( 2 ) ;
  159. }
  160. i++ ;
  161. }
  162. }
  163. *lpNowPos =cbString ;
  164. return( nStatus ) ;
  165. }
  166. //把BIG5码转换成GB码
  167. void __export FAR PASCAL ChangeBig5ToGb( LPSTR lpsStr , int nLen )
  168. {
  169. for( int i=0 ; i<nLen ; i++ )
  170. {
  171. if( i < nLen-1 )
  172. {
  173. if( lpsStr[i]&0x80 ) //是一个汉字
  174. {
  175. //改变该汉字的内码
  176. p_Big5ToGb.ChangeOneHzCode( lpsStr+i ) ;
  177. i++ ;
  178. }
  179. }
  180. }
  181. }
  182. //把GB码转换成BIG5码
  183. void __export FAR PASCAL ChangeGbToBig5( LPSTR lpsStr , int nLen )
  184. {
  185. for( int i=0 ; i<nLen ; i++ )
  186. {
  187. if( i < nLen-1 )
  188. {
  189. if( lpsStr[i]&0x80 ) //是一个汉字
  190. {
  191. //改变该汉字的内码
  192. p_GbToBig5.ChangeOneHzCode( lpsStr+i ) ;
  193. i++ ;
  194. }
  195. }
  196. }
  197. }
  198. //把GB码转换成HZ码
  199. void __export FAR PASCAL ChangeGbToHz( LPSTR lpsStr , int nLen )
  200. {
  201. for( int i=0 ; i<nLen ; i++ )
  202. lpsStr[i] &=0x7f ;
  203. }
  204. //画一个双线的立体边框.
  205. //RECT描述的是要画的四边形的左上角和右下角的坐标位置,包括左上角和右下角
  206. //bFlag为1,没有按下,0按下
  207. //color为面上的颜色
  208. void __export FAR PASCAL DrawTwoLineBox( HDC hdc , 
  209. const RECT &rect , BOOL bFlag , COLORREF color ) 
  210. {
  211. CDC dc ;
  212. dc.m_hDC =hdc ;
  213. //浅灰笔
  214. CPen LowGrayPen( PS_SOLID , 1 , RGB( 192 , 192 , 192 ) ) ;
  215. //深灰笔
  216. CPen HighGrayPen( PS_SOLID , 1 , RGB( 128 , 128 , 128 ) ) ;
  217. CBrush brush( color ) ;
  218. //画上底色
  219. CPen *pOldPen =(CPen*)dc.SelectStockObject( BLACK_PEN ) ;//黑笔
  220. CBrush *pOldBrush =dc.SelectObject( &brush ) ;
  221. dc.Rectangle( rect.left , rect.top , rect.right+1 , rect.bottom+1 ) ;
  222. dc.SelectObject( pOldBrush ) ; //恢复刷子
  223. dc.SelectObject( &LowGrayPen ) ; //浅灰笔
  224. if( bFlag ) //是没有按下的按钮
  225. {
  226. dc.MoveTo( rect.right-1 , rect.top ) ;
  227. //画左上角外面的浅灰线
  228. dc.LineTo( rect.left , rect.top ) ;
  229. dc.LineTo( rect.left , rect.bottom ) ;
  230. }
  231. else //是按下的按钮
  232. {
  233. dc.MoveTo( rect.right , rect.top ) ;
  234. //画右下角外面的浅灰线
  235. dc.LineTo( rect.right , rect.bottom ) ;
  236. dc.LineTo( rect.left-1 , rect.bottom ) ;
  237. }
  238. //画左上角内线,没有按下是白色,按下是深灰色的
  239. if( bFlag )
  240. dc.SelectStockObject( WHITE_PEN ) ; //白笔
  241. else
  242. dc.SelectObject( &HighGrayPen ) ; //深灰笔
  243. dc.MoveTo( rect.right-2 , rect.top+1 ) ;
  244. dc.LineTo( rect.left+1 , rect.top+1 ) ;
  245. dc.LineTo( rect.left+1 , rect.bottom-1 ) ;
  246. //画右下角内线,没有按下是深灰色,按下是白色
  247. if( bFlag )
  248. dc.SelectObject( &HighGrayPen ) ;
  249. else
  250. dc.SelectStockObject( WHITE_PEN ) ;
  251. dc.MoveTo( rect.left+1 , rect.bottom-1 ) ;
  252. dc.LineTo( rect.right-1 , rect.bottom-1 ) ;
  253. dc.LineTo( rect.right-1 , rect.top ) ;
  254. //恢复笔
  255. dc.SelectObject( pOldPen ) ;
  256. }
  257. //画一个单线的立体边框
  258. //RECT描述的是要画的四边形的左上角和右下角的坐标位置,包括左上角和右下角
  259. //bFlag为1,没有按下,0按下
  260. //没有按下时,color1为左上角线的颜色,color2为右下角线的颜色
  261. //按下相反。color为面上的颜色
  262. void __export FAR PASCAL DrawOneLineBox( HDC hdc , 
  263. const RECT &rect , BOOL bFlag , 
  264. COLORREF color1 , COLORREF color2 , COLORREF color )
  265. {
  266. CDC dc ;
  267. dc.m_hDC =hdc ;
  268. CPen pen1( PS_SOLID , 1 , color1 ) ;
  269. CPen pen2( PS_SOLID , 1 , color2 ) ;
  270. CBrush brush( color ) ;
  271. //画上底色
  272. CPen *pOldPen =dc.SelectObject( &pen2 ) ;
  273. CBrush *pOldBrush =dc.SelectObject( &brush ) ;
  274. dc.Rectangle( rect.left , rect.top , rect.right+1 , rect.bottom+1 ) ;
  275. dc.SelectObject( pOldBrush ) ;
  276. dc.SelectObject( &pen1 ) ;
  277. if( bFlag ) //没有按下
  278. {
  279. dc.MoveTo( rect.right-1 , rect.top ) ;
  280. //画左上角线
  281. dc.LineTo( rect.left , rect.top ) ;
  282. dc.LineTo( rect.left , rect.bottom ) ;
  283. }
  284. else
  285. {
  286. dc.MoveTo( rect.right , rect.top ) ;
  287. //画右下角线
  288. dc.LineTo( rect.right , rect.bottom ) ;
  289. dc.LineTo( rect.left-1 , rect.bottom ) ;
  290. }
  291. //恢复笔
  292. dc.SelectObject( pOldPen ) ;
  293. }
  294. //清屏
  295. void __export FAR PASCAL UpdateScreen( void )
  296. {
  297. ::InvalidateRect( NULL , NULL , FALSE ) ;
  298. ::UpdateWindow( GetDesktopWindow() ) ;
  299. }
  300. #ifdef __cplusplus
  301. }
  302. #endif