HZmodev.c
上传用户:shdz666
上传日期:2007-01-03
资源大小:566k
文件大小:10k
源码类别:

输入法编程

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 1999.4  Li ZhenChun
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify
  5.  * it under the terms of the GNU General Public License as published by
  6.  * the Free Software Foundation; either version 2 of the License; or
  7.  * (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that is will be useful, but
  10.  * WITHOUT ANY WARRANTY; without even the implied warranty of 
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12.  * General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 675 Mass Ave, Cambridge, M A 02139, USA.
  17.  *
  18.  * Author: Li ZhenChun  email: zhchli@163.net or zhchli@126.com
  19.  * 
  20.  */
  21. #include "freepy.h"
  22. static BYTE bPunctChar[9][192] = {
  23. //A1
  24. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  25.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  26.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  27.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  28.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  29.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  30.   0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  31.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  32.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  33.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  34.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  35.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 //F0-FF
  36. },
  37. //A2
  38. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  39.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  40.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  41.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  42.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  43.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  44.   0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, //A0-AF
  45.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  46.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  47.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  48.   1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0, //E0-EF
  49.   0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0 //F0-FF
  50. },
  51. //A3
  52. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  53.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  54.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  55.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  56.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  57.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  58.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  59.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  60.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  61.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  62.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  63.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0 //F0-FF
  64. },
  65. //A4
  66. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  67.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  68.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  69.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  70.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  71.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  72.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  73.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  74.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  75.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  76.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  77.   1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
  78. },
  79. //A5
  80. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  81.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  82.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  83.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  84.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  85.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  86.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  87.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  88.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  89.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  90.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  91.   1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 //F0-FF
  92. },
  93. //A6
  94. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  95.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  96.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  97.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  98.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  99.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  100.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  101.   1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, //B0-BF
  102.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  103.   1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, //D0-DF
  104.   1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1, //E0-EF
  105.   1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0 //F0-FF
  106. },
  107. //A7
  108. { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
  109.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
  110.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
  111.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
  112.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
  113.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
  114.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  115.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  116.   1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //C0-CF
  117.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  118.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  119.   1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
  120. },
  121. //A8
  122. { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //40-4F
  123.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //50-5F
  124.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //60-6F
  125.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, //70-7F
  126.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //80-8F
  127.   1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, //90-9F
  128.   0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  129.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  130.   1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  131.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  132.   1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, //E0-EF
  133.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
  134. },
  135. //A9
  136. { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //40-4F
  137.   1,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0, //50-5F
  138.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //60-6F
  139.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, //70-7F
  140.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //80-8F
  141.   1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, //90-9F
  142.   0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
  143.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
  144.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
  145.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
  146.   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
  147.   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
  148. }
  149. };
  150. BOOL CharHandleV( HIMC hIMC,WORD wParam,LONG lParam)
  151. {
  152.     LPINPUTCONTEXT lpIMC;
  153. LPCANDIDATEINFO lpCandInfo;
  154. LPCANDIDATELIST lpCandList;
  155. LPCOMPOSITIONSTRING lpCompStr;
  156. GENEMSG GnMsg;
  157. WORD wCount;
  158. WORD wTemp;
  159. static BYTE bHead,bDirect;
  160. static WORD wPos,wPrePos;
  161. BYTE bPunct[4];
  162. #define FORWARD 0x01
  163. #define BACKWARD 0x02
  164. bPunct[2] = 0;
  165. bPunct[3] = 0;
  166.     lpIMC = ImmLockIMC(hIMC);
  167. lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
  168. lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo  + lpCandInfo->dwOffset[0]);
  169. lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
  170. if( !lpCandList->dwCount ){
  171. if( wParam >= _T('1') && wParam <= _T('9') ) {
  172. LPTSTR lpStr;
  173. WORD wStrLen;
  174. wPos = 0x40;
  175. wPrePos = 0x40;
  176. bDirect = FORWARD;
  177. bHead =(BYTE)( wParam - _T('1'));
  178. lpCandList->dwPageSize = 10;
  179. lpCandList->dwPageStart = 2;
  180. wCount = 0;
  181. while( wPos <= 0xFF ) {
  182. if(bPunctChar[bHead][wPos-0x40]){
  183. bPunct[0] = 0xA1 + bHead;
  184. bPunct[1] = (BYTE)wPos;
  185. memcpy((LPBYTE)GETLPCANDSTR(lpCandList,wCount+2),bPunct,4);
  186. wCount++;
  187. }
  188. wPos++;
  189. if(wCount == lpCandList->dwPageSize) break;
  190. }
  191. lpCandList->dwCount = wCount;
  192. lpStr = GETLPCOMPSTR(lpCompStr);
  193. wStrLen = _tcslen(lpStr);
  194. *(lpStr + wStrLen) = (TCHAR)wParam;
  195. *(lpStr + wStrLen +1) = _T('');
  196. lpStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr;
  197. wStrLen = _tcslen(lpStr);
  198. *(lpStr + wStrLen) = (TCHAR)wParam;
  199. *(lpStr + wStrLen +1) = _T('');
  200. GnMsg.msg = WM_IME_COMPOSITION;
  201. GnMsg.wParam = 0;
  202. GnMsg.lParam = GCS_COMPSTR;
  203. GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
  204. }
  205. else MessageBeep(0xFFFFFFFF );
  206. }
  207. else{
  208. if( wParam == _T('=') || wParam == _T('.') || wParam == _T('>')) {
  209. if( bDirect & BACKWARD ) {
  210. bDirect = FORWARD;
  211. wPos = wPrePos+1;
  212. }
  213. DebugLog(4,(DebugLogFile,"---forward: %lx %lxn",wPrePos,wPos));
  214. if (wPos >= 0xFF ) {
  215. MessageBeep(0xFFFFFFFF );
  216. goto my_exit;
  217. }
  218. if(wPos < 0x40 ) wPos = 0x40;
  219. wPrePos = wPos;
  220. wCount = 0;
  221. while( wPos <= 0xFF ) {
  222. if(bPunctChar[bHead][wPos-0x40]){
  223. bPunct[0] = 0xA1 + bHead;
  224. bPunct[1] = (BYTE)wPos;
  225. memcpy((LPBYTE)GETLPCANDSTR(lpCandList,wCount+2),bPunct,4);
  226. wCount++;
  227. }
  228. wPos++;
  229. if(wCount == lpCandList->dwPageSize) break;
  230. }
  231. lpCandList->dwCount = wCount;
  232. DebugLog(4,(DebugLogFile,"forward: %lx %lxn",wPrePos,wPos));
  233. GnMsg.msg = WM_IME_COMPOSITION;
  234. GnMsg.wParam = 0;
  235. GnMsg.lParam = GCS_COMPSTR;
  236. GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
  237. }
  238. else if( wParam == _T('-') || wParam == _T(',') || wParam == _T('<')) {
  239. TCHAR szStrArr[30][4];
  240. DebugLog(4,(DebugLogFile,"+++backward: %lx %lxn",wPrePos,wPos));
  241. if( bDirect & FORWARD ) {
  242. bDirect = BACKWARD;
  243. wPos = wPrePos-1;
  244. }
  245. DebugLog(4,(DebugLogFile,"---backward: %lx %lxn",wPrePos,wPos));
  246. if (wPos < 0x40 ) {
  247. MessageBeep(0xFFFFFFFF );
  248. goto my_exit;
  249. }
  250. if(wPos > 0xFF) wPos = 0xFF;
  251. wPrePos = wPos;
  252. wCount = 0;
  253. while( wPos >= 0x40 ) {
  254. if(bPunctChar[bHead][wPos-0x40]){
  255. bPunct[0] = 0xA1 + bHead;
  256. bPunct[1] = (BYTE)wPos;
  257. memcpy((LPBYTE)szStrArr[wCount],bPunct,4);
  258. wCount++;
  259. }
  260. wPos--;
  261. if(wCount == lpCandList->dwPageSize) break;
  262. }
  263. DebugLog(4,(DebugLogFile,"backward: %lx %lxn",wPrePos,wPos));
  264. if( wCount == 0){
  265. MessageBeep(0xFFFFFFFF );
  266. goto my_exit;
  267. }
  268. lpCandList->dwCount = wCount;
  269. wTemp = 2;
  270. while(wCount--){
  271. _tcscpy(GETLPCANDSTR(lpCandList,wTemp++),szStrArr[wCount]);
  272. }
  273. GnMsg.msg = WM_IME_COMPOSITION;
  274. GnMsg.wParam = 0;
  275. GnMsg.lParam = GCS_COMPSTR;
  276. GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
  277. }
  278. else if( wParam >= _T('0') && wParam <= _T('9') ){
  279. SelectCandFromCandlist(hIMC, wParam);
  280. }
  281. }
  282. my_exit:
  283. ImmUnlockIMCC(lpIMC->hCompStr);
  284. ImmUnlockIMCC(lpIMC->hCandInfo);
  285. ImmUnlockIMC(hIMC);
  286. #undef FORWARD
  287. #undef BACKWARD
  288. return TRUE;
  289. }