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

多国语言处理

开发平台:

Visual C++

  1. //输出串的缓冲区
  2. #include "stdafx.h"
  3. #include <windowsx.h>
  4. #include "cspublic.h"
  5. class CStrBuff //显示字符串缓冲类
  6. {
  7. public:
  8. HDC hdc ; //当前HDC
  9. POINT pos ; //当前显示位置
  10. POINT point ; //当前鼠标所在点
  11. LPSTR lpsStr ; //显示英文串缓冲区
  12. int nLen ; //英文串长度
  13. int m_nPosOfHz ; //如果是汉字串,标记光标在哪个汉字上
  14. private:
  15. BOOL m_bHzMatchFlag ; //0,标记汉字是最小匹配,1为最大
  16. public:
  17. CStrBuff( void ) ;
  18. //判断字符串的哪部分在当前鼠标点上
  19. BOOL JudgePosOfStr( LPSTR lps , int nLen , 
  20. LPINT nFirst , LPINT nLast ) ;
  21. //显示翻译结果
  22. void Show( LPSTR s ) ;
  23. //设置汉字匹配方式
  24. void SetHzMatchFlag( BOOL bFlag ) ;
  25. //得到汉字匹配方式
  26. BOOL GetHzMatchFlag( void ) ;
  27. } ;
  28. CStrBuff::CStrBuff( void )
  29. {
  30. m_bHzMatchFlag =0 ;
  31. }
  32. //设置汉字匹配方式
  33. void CStrBuff::SetHzMatchFlag( BOOL bFlag )
  34. {
  35. m_bHzMatchFlag =bFlag ;
  36. }
  37. //得到汉字匹配方式
  38. BOOL CStrBuff::GetHzMatchFlag( void )
  39. {
  40. return m_bHzMatchFlag ;
  41. }
  42. //判断字符串的哪部分在当前鼠标点上
  43. //#define _MYDEBUG
  44. #ifdef _MYDEBUG
  45. int nnn=1 ;
  46. #endif
  47. BOOL CStrBuff::JudgePosOfStr( LPSTR lps , int nLen , 
  48. LPINT nFirst , LPINT nLast )
  49. {
  50. RECT rect ;
  51. rect.top =pos.y ; //是TOP
  52. POINT zeroPoint ={ 0 , 0 } ; //得到原点位置
  53. LPtoDP( hdc , &zeroPoint , 1 ) ; //转换成设置坐标
  54. POINT tempPoint ; //临时点,用以转换
  55. tempPoint.y =HIWORD( GetTextExtent( hdc , lps , nLen ) ) ; //高度
  56. LPtoDP( hdc , &tempPoint , 1 ) ;
  57. tempPoint.y -=zeroPoint.y ; //得到字符串高度
  58. // if( GetMapMode( hdc ) == MM_TEXT )
  59. // {
  60. // rect.top =pos.y ;
  61. rect.bottom =pos.y + abs( tempPoint.y ) - 1 ;
  62. /* }
  63. else
  64. {
  65. rect.top =pos.y - abs( tempPoint.y ) + 1 ;
  66. rect.bottom =pos.y ;
  67. }
  68. */
  69. int n1 , n2 ;
  70. int nFlag ; //标记是汉字串还英文串,2为汉字串,1为英文串
  71. for( n2=0 ; n2<nLen ; )
  72. {
  73. //消去非字母部分
  74. for( n1=n2 ; n1<nLen ; n1++ )
  75. {
  76. if( n1<nLen-1 )
  77. {
  78. if( lps[n1] & 128 ) //是汉字
  79. {
  80. nFlag =2 ;
  81. break ;
  82. }
  83. }
  84. // if( isalpha( lps[n1] ) ) //是字母
  85. if( ( lps[n1]>='a' && lps[n1]<='z' ) ||
  86. ( lps[n1]>='A' && lps[n1]<='Z' ) )
  87. {
  88. nFlag =1 ;
  89. break ;
  90. }
  91. }
  92. if( n1 == nLen ) //已经到头了
  93. return 0 ;
  94. //得到字母串或汉字串
  95. for( n2=n1 ; n2<nLen ; n2++ )
  96. {
  97. if( nFlag == 1 ) //得到英文串
  98. {
  99. // if( !isalpha( lps[n2] ) ) //不是字母
  100. if( !(( lps[n2]>='a' && lps[n2]<='z' ) ||
  101.   ( lps[n2]>='A' && lps[n2]<='Z' ) ) )
  102. break ;
  103. }
  104. else //得到汉字串
  105. {
  106. if( n2==nLen-1 )
  107. break ;
  108. //还可能是汉字
  109. if( !(lps[n2] & 128) ) //不是汉字
  110. break ;
  111. n2++ ;
  112. }
  113. }
  114.                      
  115. //计算字符串所包围的矩形
  116. tempPoint.x =LOWORD( GetTextExtent( hdc , lps , n1 ) ) ;
  117. LPtoDP( hdc , &tempPoint , 1 ) ;
  118. tempPoint.x -=zeroPoint.x ;
  119. rect.left =pos.x + tempPoint.x ;
  120. tempPoint.x =LOWORD( GetTextExtent( hdc , lps , n2 ) ) ;
  121. LPtoDP( hdc , &tempPoint , 1 ) ;
  122. tempPoint.x -=zeroPoint.x ;
  123. rect.right =pos.x + tempPoint.x ;
  124. #ifdef _MYDEBUG
  125. char sBuff[2000] ;
  126. wsprintf( sBuff , 
  127. "[1%c 2%s] len=%d n1=%dn2=%d nFlag=%d x=%d y=%d l=%d r=%d t=%d b=%d" ,
  128. lps[n1] , lps+n1+1 ,  nLen , n1 , n2 , nFlag ,
  129. point.x , point.y , rect.left , rect.right , rect.top , rect.bottom ) ;
  130. char s[10] ;
  131. wsprintf( s , "%d:" , nnn++ ) ;
  132. WritePrivateProfileString( "judge" , s , sBuff , "test.ini" ) ;
  133. #endif
  134. //判断该字母串是否在当前鼠标点上
  135. if( point.x >= rect.left && point.x <=rect.right &&
  136. point.y>= rect.top && point.y <= rect.bottom ) //点落在其中
  137. {
  138. *nFirst =n1 ;
  139. *nLast =n2 ;
  140. //确定光标在第几个汉字上
  141. if( lps[n1] & 0x80 ) //是汉字
  142. for( m_nPosOfHz=0 ;  //设置初始汉字位置为0
  143. LOWORD(GetTextExtent( hdc , lps+n1 , (m_nPosOfHz+1)*2 ))
  144. <(DWORD)(point.x-rect.left+1) ;
  145. m_nPosOfHz++ )
  146. ;
  147. return 1 ;
  148. }
  149. }
  150. return 0 ;
  151. }
  152. //显示翻译结果
  153. void CStrBuff::Show( LPSTR lpsDestination )
  154. {
  155. int nDestinationLen =_fstrlen( lpsDestination ) ;
  156. //得到光标的高度
  157. int nCursorHeight =GetSystemMetrics( SM_CYCURSOR ) ;
  158. if( GetWinOrBar() ) //详细解释指取结果
  159. ShowFinger( point.x , 
  160. point.y+nCursorHeight/3 ,
  161. lpsDestination , nDestinationLen ) ;
  162. else //简单解释指取结果
  163. ShowFinger( point.x , 
  164. point.y+nCursorHeight/2 ,
  165. lpsDestination , nDestinationLen ) ;
  166. }
  167. //------------------------------------------------------------------//
  168. CStrBuff OStrBuff ;
  169. #ifdef __cplusplus
  170. extern "C" {
  171. #endif
  172. //设置输出串的起始点
  173. void __export FAR PASCAL SetOutPos( POINT p , HDC dc )
  174. {
  175. OStrBuff.pos =p ;
  176. OStrBuff.hdc =dc ;
  177. }
  178. //设置当前鼠标点
  179. void __export FAR PASCAL SetCurrentPoint( POINT p )
  180. {
  181. OStrBuff.point =p ;
  182. }
  183. //设置输出串缓冲区
  184. //0表示没有进行指取翻译
  185. //1表示可以进行指取翻译,但不能进入显示字符串缓冲区
  186. //2能够进入
  187. //3表示不能进入
  188. void __export FAR PASCAL SetStrBuff( LPSTR lps , int n )
  189. {
  190. HideFinger() ;
  191. if( n<=0 ) //现在是空串
  192. return ;
  193. //判断串的哪部分落在当前鼠标点上
  194. int nFirst , nLast ; //标识该部分
  195. if( !OStrBuff.JudgePosOfStr( lps , n , 
  196. (LPINT)&nFirst , (LPINT)&nLast ) )
  197. return ; //没有落在鼠标点
  198. //分配空间
  199. OStrBuff.lpsStr =(LPSTR)GlobalAllocPtr( GMEM_FIXED , 
  200. nLast-nFirst+1 ) ;   
  201. if( !OStrBuff.lpsStr )
  202. {
  203. ::MessageBox( 0 , "GlobalAllocPtr error,in SetStrBuff" , 0 , MB_OK ) ;
  204. return ;
  205. }
  206. //拷贝内容
  207. _fstrncpy( OStrBuff.lpsStr , lps+nFirst , nLast-nFirst ) ;
  208. OStrBuff.nLen =nLast-nFirst ;
  209. OStrBuff.lpsStr[OStrBuff.nLen] ='' ; //结束标记
  210. SetFingerTranslate( 3 ) ; //这次已经不能进入了
  211. if( OStrBuff.lpsStr[0] & 0x80 ) //是汉字
  212. {
  213. //释放原来的东西
  214. GlobalFreePtr( OStrBuff.lpsStr ) ;
  215. return ;
  216. }
  217. nFirst =0 ;
  218. if( _fstrlen( OStrBuff.lpsStr+nFirst )==0 ) //长度为0
  219. {
  220. //释放原来的东西
  221. GlobalFreePtr( OStrBuff.lpsStr ) ;
  222. return ;
  223. }
  224. //进行翻译
  225. char lpStr[1024] ;
  226. int nLenOfStr ;
  227. if( !EnglishToChinese( OStrBuff.lpsStr , OStrBuff.nLen ,
  228.   lpStr , 1024 , &nLenOfStr ) )
  229. {
  230. //释放原来的东西
  231. GlobalFreePtr( OStrBuff.lpsStr ) ;
  232. return ;
  233. }
  234. /*
  235. HANDLE hExplain ;
  236. if( *OStrBuff.lpsStr & 0x80 ) //是汉字
  237. {
  238. //进行汉字分词
  239. if( OStrBuff.GetHzMatchFlag() ) //最大匹配
  240. GetChnMaxMatchWord( OStrBuff.lpsStr , OStrBuff.nLen , 
  241. OStrBuff.m_nPosOfHz , (LPINT)&nFirst , (LPINT)&nLast ) ;
  242. else //最小匹配
  243. GetChnMinMatchWord( OStrBuff.lpsStr , OStrBuff.nLen , 
  244. OStrBuff.m_nPosOfHz , (LPINT)&nFirst , (LPINT)&nLast ) ;
  245. OStrBuff.lpsStr[nLast+1] ='' ; //设上结束标记
  246. }
  247. else //是英文串
  248. nFirst =0 ;
  249. if( _fstrlen( OStrBuff.lpsStr+nFirst )==0 ) //长度为0
  250. {
  251. //释放原来的东西
  252. GlobalFreePtr( OStrBuff.lpsStr ) ;
  253. return ;
  254. }
  255. //得到翻译结果
  256. if( !GetWinOrBar() ) //详细解释指取结果
  257. hExplain =FindWord( OStrBuff.lpsStr+nFirst , 1 ) ;
  258. else //简单显示翻译结果
  259. hExplain =FindWord( OStrBuff.lpsStr+nFirst , 0 ) ;
  260. if( !hExplain )
  261. {
  262. //释放原来的东西
  263. GlobalFreePtr( OStrBuff.lpsStr ) ;
  264. return ;
  265. }
  266. LPSTR lpStr = (LPSTR)GlobalLock(hExplain);
  267. if( !lpStr ) //查找有问题
  268. {
  269. //释放原来的东西
  270. GlobalFreePtr( OStrBuff.lpsStr ) ;
  271. GlobalUnlock(hExplain);
  272. GlobalFree(hExplain);
  273. return ;
  274. }
  275. if( *((LPINT)lpStr)==0 ) //返回个数为0
  276. {
  277. //释放原来的东西
  278. GlobalFreePtr( OStrBuff.lpsStr ) ;
  279. GlobalUnlock(hExplain);
  280. GlobalFree(hExplain);
  281. return ;
  282. }
  283. int  nEndPos = sizeof(int);
  284. size_t nLenOfStr =_fstrlen( lpStr+nEndPos ) ; //字符串长度
  285. */
  286. int nEndPos =0 ;
  287. //计算查询到的单词的长度
  288. // for( size_t nLenOfResult=0 ; nLenOfResult<nLenOfStr ;nLenOfResult++ )
  289. for( int nLenOfResult=0 ; nLenOfResult<nLenOfStr ;nLenOfResult++ )
  290. if( *(lpStr+nEndPos+nLenOfResult)==':' )
  291. break ;
  292. if( nLenOfResult >= nLenOfStr ) //有问题
  293. {
  294. //释放原来的东西
  295. GlobalFreePtr( OStrBuff.lpsStr ) ;
  296. // GlobalUnlock(hExplain);
  297. // GlobalFree(hExplain);
  298. return ;
  299. }
  300. BOOL bSame ; //0,不同,1相同
  301. if( nLenOfResult == _fstrlen( OStrBuff.lpsStr+nFirst ) ) //与原单词同长
  302. {
  303. //比较查询到的单词与原来的单词是否一样
  304. LPSTR lpsBuff1 =(LPSTR)GlobalAllocPtr( GMEM_FIXED ,
  305. _fstrlen( OStrBuff.lpsStr+nFirst )+1 ) ;
  306. VERIFY( lpsBuff1 ) ;
  307. _fstrcpy( lpsBuff1 , OStrBuff.lpsStr+nFirst ) ;
  308. LPSTR lpsBuff2 =(LPSTR)GlobalAllocPtr( GMEM_FIXED ,
  309. nLenOfStr+1 ) ;
  310. VERIFY( lpsBuff2 ) ;
  311. _fstrcpy( lpsBuff2 , lpStr+nEndPos ) ;
  312. if( _fstrncmp( AnsiLower( lpsBuff1 ) ,
  313.   AnsiLower( lpsBuff2 ) , 
  314.   _fstrlen( OStrBuff.lpsStr+nFirst ) ) )
  315. bSame =0 ; //查询到的单词与原来的单词不一样
  316. else
  317. bSame =1 ; //一样
  318. GlobalFreePtr( lpsBuff1 ) ;
  319. GlobalFreePtr( lpsBuff2 ) ;
  320. }
  321. else //不同长
  322. bSame =0 ;
  323. if( !bSame ) //不一样
  324. {
  325. //分配空间
  326. LPSTR lpsBuff =(LPSTR)GlobalAllocPtr( GMEM_FIXED , 
  327. _fstrlen( OStrBuff.lpsStr+nFirst ) + 4 +
  328.   nLenOfStr + 1 ) ;
  329. VERIFY( lpsBuff ) ;
  330. _fstrcpy( lpsBuff , OStrBuff.lpsStr+nFirst ) ;
  331. char sss[5] ={ ' ' , 0xa1 , 0xfa , ' ' , '' } ; //->
  332. _fstrcat( lpsBuff , sss ) ;
  333. // _fstrcat( lpsBuff , " -> " ) ;
  334. _fstrcat( lpsBuff , lpStr+nEndPos ) ;
  335. // if( GetOutputCode()==1 ) //BIG5
  336. // ChangeGbToBig5( lpsBuff , _fstrlen( OStrBuff.lpsStr+nFirst ) + 
  337. // 4 + nLenOfStr + 1 ) ; 
  338. OStrBuff.Show( lpsBuff  ) ; //显示翻译结果
  339. //释放空间
  340. GlobalFreePtr( lpsBuff ) ;
  341. }
  342. else //一样
  343. {
  344. _fstrncpy( lpStr+nEndPos , OStrBuff.lpsStr+nFirst ,
  345. _fstrlen( OStrBuff.lpsStr+nFirst ) ) ; //恢复成原来的单词
  346. // if( GetOutputCode()==1 ) //BIG5
  347. // ChangeGbToBig5( lpStr+nEndPos , 
  348. // _fstrlen( lpStr+nEndPos ) ) ;
  349. OStrBuff.Show( lpStr+nEndPos ) ; //显示翻译结果
  350. }
  351. //释放原来的东西
  352. GlobalFreePtr( OStrBuff.lpsStr ) ;
  353. // GlobalUnlock(hExplain);
  354. // GlobalFree(hExplain);
  355. }
  356. //设置汉字匹配方式
  357. void __export FAR PASCAL SetHzMatchFlag( BOOL bFlag )
  358. {
  359. OStrBuff.SetHzMatchFlag( bFlag ) ;
  360. }
  361. #ifdef __cplusplus
  362. }
  363. #endif