HZmodev.c
上传用户:szljw888
上传日期:2010-04-11
资源大小:124k
文件大小:10k
源码类别:

输入法编程

开发平台:

C/C++

  1. /* 大熊猫输入法(Free Chinese Input)  由YJMSIR(yjmsir@163.com)编写
  2.  * 协议: GPL
  3.  * freeinput( A Chinese Input Method) by YJMSIR(yjmsir@163.com)
  4.  * Licence: GPL 
  5.  */
  6. #include "freepy.h"
  7. static BYTE bPunctChar[11][192] = {
  8. //A1
  9. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  10.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  11.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  12.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  13.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  14.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  15.   0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  16.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  17.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  18.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  19.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  20.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 //F0-FF
  21. },
  22. //A2
  23. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  24.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  25.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  26.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  27.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  28.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  29.   0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, //A0-AF
  30.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  31.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  32.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  33.   1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0, //E0-EF
  34.   0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0 //F0-FF
  35. },
  36. //A3
  37. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  38.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  39.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  40.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  41.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  42.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  43.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  44.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  45.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  46.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  47.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  48.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0 //F0-FF
  49. },
  50. //A4
  51. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  52.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  53.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  54.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  55.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  56.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  57.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  58.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  59.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  60.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  61.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  62.   1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
  63. },
  64. //A5
  65. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  66.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  67.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  68.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  69.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  70.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  71.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  72.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  73.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  74.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  75.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  76.   1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 //F0-FF
  77. },
  78. //A6
  79. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  80.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  81.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  82.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  83.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  84.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  85.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  86.   1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, //B0-BF
  87.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  88.   1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, //D0-DF
  89.   1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1, //E0-EF
  90.   1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0 //F0-FF
  91. },
  92. //A7
  93. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  94.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  95.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  96.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  97.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  98.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  99.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  100.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  101.   1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //C0-CF
  102.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  103.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  104.   1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
  105. },
  106. //A8
  107. { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //40-4F
  108.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //50-5F
  109.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //60-6F
  110.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, //70-7F
  111.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //80-8F
  112.   1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, //90-9F
  113.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  114.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  115.   1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  116.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  117.   1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, //E0-EF
  118.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
  119. },
  120. //A9
  121. { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //40-4F
  122.   1,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0, //50-5F
  123.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //60-6F
  124.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, //70-7F
  125.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //80-8F
  126.   1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, //90-9F
  127.   0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  128.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  129.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  130.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  131.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  132.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
  133. },
  134. //A10由俞建明添加,用于区位码输出。
  135. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  136.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  137.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  138.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  139.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  140.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  141.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  142.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  143.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  144.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  145.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  146.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 //F0-FF
  147. },
  148. //A11由俞建明添加,用于GBK码输出。
  149. { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //40-4F
  150.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //50-5F
  151.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //60-6F
  152.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, //70-7F
  153.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //80-8F
  154.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //90-9F
  155.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  156.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  157.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  158.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  159.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  160.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 //F0-FF
  161.   }
  162. };
  163. BOOL CharHandleV( HIMC hIMC,WORD wParam,LONG lParam)
  164. {
  165.     LPINPUTCONTEXT lpIMC;
  166. LPCANDIDATEINFO lpCandInfo;
  167. LPCANDIDATELIST lpCandList;
  168. LPCOMPOSITIONSTRING lpCompStr;
  169. LPTSTR lpStr,lpStr1;
  170. GENEMSG GnMsg;
  171. WORD wCount,wStrLen;
  172. static BYTE YjmGBKFlag=0;
  173. WORD wPos= 0x40;
  174. BYTE bHead,bPunct[4];
  175. _tcscpy(YJMMessage,_T("(x切换):"));
  176. bPunct[2] = 0;
  177. bPunct[3] = 0;
  178.     lpIMC = ImmLockIMC(hIMC);
  179. lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
  180. lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo  + lpCandInfo->dwOffset[0]);
  181. lpCandList->dwPageSize = 10;
  182. lpCandList->dwPageStart = 2;
  183. lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
  184. lpStr = GETLPCOMPSTR(lpCompStr);
  185. wStrLen = _tcslen(lpStr);
  186. //本程序的思路是以lpCompStr为中心,通过计算取得bHead与wPos,然后控制显示
  187. //第一步.由按键更新lpCompStr
  188. //0~9的按键,加入
  189. if( wParam >= _T('0') && wParam <= _T('9') ) {
  190. if(wStrLen==1 && *lpStr=='v') wStrLen=0;
  191. *(lpStr + wStrLen) = (TCHAR)wParam;
  192. *(lpStr + wStrLen +1) = _T('');
  193. wStrLen = _tcslen(lpStr);
  194. lpCompStr->dwCompStrLen = wStrLen;
  195. }
  196. //切换GBK标志
  197. else if( wParam == _T('x')) {YjmGBKFlag=(YjmGBKFlag&1)?0:1; }
  198. //向后翻页
  199. else if( wParam == _T('=') || wParam == _T('.') || wParam == _T('>')) {
  200. if(YjmGBKFlag && wStrLen==3){if(*(lpStr + wStrLen-1)<_T('0')+20) *(lpStr + wStrLen-1)+=1;}
  201. else if(*(lpStr + wStrLen-1)<_T('9')) *(lpStr + wStrLen-1)+=1;
  202. }
  203. //向前翻页
  204. else if( wParam == _T('-') || wParam == _T(',') || wParam == _T('<')) {
  205. if(*(lpStr + wStrLen-1)>_T('0')) *(lpStr + wStrLen-1)-=1;
  206. }
  207. //对其它的按键,显示提示
  208. else { MessageBeep(0xFFFFFFFF );_tcscpy(YJMMessage,_T("(有效按键为0-9,x及,.):"));
  209.        goto my_disp;}
  210. if(wStrLen==0) { MessageBeep(0xFFFFFFFF );_tcscpy(YJMMessage,_T("(有效首键为0-9及x):"));
  211.        goto my_disp;}
  212. //第二步.由lpCompStr计算bHead与wPos的值
  213. //计算bHead
  214. bHead=(wStrLen==0)?1:((wStrLen==1)?(BYTE)(*(lpStr)-_T('0'))*10:(BYTE)(*(lpStr)-_T('0'))*10+(BYTE)(*(lpStr+1)-_T('0'))-1);
  215. //计算wPos
  216. if( wStrLen==3){
  217. //取得第x十个有效字符的位置wPos
  218. wCount = 0;
  219. while( wPos <= 0xFF ) {
  220. if(bPunctChar[YjmGBKFlag?10:(bHead>9?9:bHead)][wPos-0x40])wCount++;
  221. wPos++;
  222. if(wCount ==(BYTE)( *(lpStr + 2) - _T('0'))*10) break;
  223. }
  224. }
  225. //对第四按键的处理
  226. if( wStrLen==4){
  227. SelectCandFromCandlist(hIMC, *(lpStr + 3));
  228. goto my_exit;
  229. }
  230. if( wStrLen>4){
  231. MakeResultString(hIMC,FALSE);
  232. goto my_exit;
  233. }
  234. //越界,显示提示
  235. if(bHead>=94||bHead<0) {
  236. MessageBeep(0xFFFFFFFF );
  237. _tcscpy(YJMMessage,_T("(越界:有效区号范围为01-94):"));
  238. goto my_disp;}
  239. //准备备选的十个字符
  240. wCount = 0;
  241. while( wPos <= 0xFF ) {
  242. if(bPunctChar[YjmGBKFlag?10:(bHead>9?9:bHead)][wPos-0x40]){
  243. bPunct[0] = 0xA1 + bHead;
  244. bPunct[1] = (BYTE)wPos;
  245. memcpy((LPBYTE)GETLPCANDSTR(lpCandList,wCount+2),bPunct,4);
  246. wCount++;
  247. }
  248. wPos++;
  249. if(wCount == lpCandList->dwPageSize) break;
  250. }
  251. lpCandList->dwCount = wCount;
  252. //显示部分
  253. my_disp:
  254. lpStr1 = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr;
  255. if(YjmGBKFlag){_tcscpy(lpStr1,VGBKMODEL);}
  256. else{_tcscpy(lpStr1,VMODEL);}
  257. _tcscat(lpStr1,YJMMessage);
  258. _tcscat(lpStr1,lpStr);
  259. GnMsg.msg = WM_IME_COMPOSITION;
  260. GnMsg.wParam = 0;
  261. GnMsg.lParam = GCS_COMPSTR;
  262. GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
  263. //DebugLog(2,(DebugLogFile,"%d   %d   %d   %d   %s   %sn",YjmGBKFlag,bHead,wPos,wStrLen,lpStr,lpStr1 ));
  264. my_exit:
  265. ImmUnlockIMCC(lpIMC->hCompStr);
  266. ImmUnlockIMCC(lpIMC->hCandInfo);
  267. ImmUnlockIMC(hIMC);
  268. return TRUE;
  269. }