HZmodev.c
资源名称:大熊猫输入法原码.zip [点击查看]
上传用户:szljw888
上传日期:2010-04-11
资源大小:124k
文件大小:10k
源码类别:
输入法编程
开发平台:
C/C++
- /* 大熊猫输入法(Free Chinese Input) 由YJMSIR(yjmsir@163.com)编写
- * 协议: GPL
- * freeinput( A Chinese Input Method) by YJMSIR(yjmsir@163.com)
- * Licence: GPL
- */
- #include "freepy.h"
- static BYTE bPunctChar[11][192] = {
- //A1
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
- 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 //F0-FF
- },
- //A2
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
- 0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, //A0-AF
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
- 1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0, //E0-EF
- 0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0 //F0-FF
- },
- //A3
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0 //F0-FF
- },
- //A4
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
- 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
- },
- //A5
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
- 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0 //F0-FF
- },
- //A6
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
- 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, //B0-BF
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
- 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, //D0-DF
- 1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1, //E0-EF
- 1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0 //F0-FF
- },
- //A7
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
- 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //C0-CF
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
- 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
- },
- //A8
- { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //40-4F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //50-5F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //60-6F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, //70-7F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //80-8F
- 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, //90-9F
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
- 1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
- 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, //E0-EF
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
- },
- //A9
- { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //40-4F
- 1,1,1,1,1,1,1,1,0,1,1,0,1,0,0,0, //50-5F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //60-6F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, //70-7F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //80-8F
- 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, //90-9F
- 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 //F0-FF
- },
- //A10由俞建明添加,用于区位码输出。
- { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //40-4F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //50-5F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //60-6F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //70-7F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //80-8F
- 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, //90-9F
- 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 //F0-FF
- },
- //A11由俞建明添加,用于GBK码输出。
- { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //40-4F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //50-5F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //60-6F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, //70-7F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //80-8F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //90-9F
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //A0-AF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //B0-BF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //C0-CF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //D0-DF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //E0-EF
- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 //F0-FF
- }
- };
- BOOL CharHandleV( HIMC hIMC,WORD wParam,LONG lParam)
- {
- LPINPUTCONTEXT lpIMC;
- LPCANDIDATEINFO lpCandInfo;
- LPCANDIDATELIST lpCandList;
- LPCOMPOSITIONSTRING lpCompStr;
- LPTSTR lpStr,lpStr1;
- GENEMSG GnMsg;
- WORD wCount,wStrLen;
- static BYTE YjmGBKFlag=0;
- WORD wPos= 0x40;
- BYTE bHead,bPunct[4];
- _tcscpy(YJMMessage,_T("(x切换):"));
- bPunct[2] = 0;
- bPunct[3] = 0;
- lpIMC = ImmLockIMC(hIMC);
- lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
- lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]);
- lpCandList->dwPageSize = 10;
- lpCandList->dwPageStart = 2;
- lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
- lpStr = GETLPCOMPSTR(lpCompStr);
- wStrLen = _tcslen(lpStr);
- //本程序的思路是以lpCompStr为中心,通过计算取得bHead与wPos,然后控制显示
- //第一步.由按键更新lpCompStr
- //0~9的按键,加入
- if( wParam >= _T('0') && wParam <= _T('9') ) {
- if(wStrLen==1 && *lpStr=='v') wStrLen=0;
- *(lpStr + wStrLen) = (TCHAR)wParam;
- *(lpStr + wStrLen +1) = _T(' ');
- wStrLen = _tcslen(lpStr);
- lpCompStr->dwCompStrLen = wStrLen;
- }
- //切换GBK标志
- else if( wParam == _T('x')) {YjmGBKFlag=(YjmGBKFlag&1)?0:1; }
- //向后翻页
- else if( wParam == _T('=') || wParam == _T('.') || wParam == _T('>')) {
- if(YjmGBKFlag && wStrLen==3){if(*(lpStr + wStrLen-1)<_T('0')+20) *(lpStr + wStrLen-1)+=1;}
- else if(*(lpStr + wStrLen-1)<_T('9')) *(lpStr + wStrLen-1)+=1;
- }
- //向前翻页
- else if( wParam == _T('-') || wParam == _T(',') || wParam == _T('<')) {
- if(*(lpStr + wStrLen-1)>_T('0')) *(lpStr + wStrLen-1)-=1;
- }
- //对其它的按键,显示提示
- else { MessageBeep(0xFFFFFFFF );_tcscpy(YJMMessage,_T("(有效按键为0-9,x及,.):"));
- goto my_disp;}
- if(wStrLen==0) { MessageBeep(0xFFFFFFFF );_tcscpy(YJMMessage,_T("(有效首键为0-9及x):"));
- goto my_disp;}
- //第二步.由lpCompStr计算bHead与wPos的值
- //计算bHead
- bHead=(wStrLen==0)?1:((wStrLen==1)?(BYTE)(*(lpStr)-_T('0'))*10:(BYTE)(*(lpStr)-_T('0'))*10+(BYTE)(*(lpStr+1)-_T('0'))-1);
- //计算wPos
- if( wStrLen==3){
- //取得第x十个有效字符的位置wPos
- wCount = 0;
- while( wPos <= 0xFF ) {
- if(bPunctChar[YjmGBKFlag?10:(bHead>9?9:bHead)][wPos-0x40])wCount++;
- wPos++;
- if(wCount ==(BYTE)( *(lpStr + 2) - _T('0'))*10) break;
- }
- }
- //对第四按键的处理
- if( wStrLen==4){
- SelectCandFromCandlist(hIMC, *(lpStr + 3));
- goto my_exit;
- }
- if( wStrLen>4){
- MakeResultString(hIMC,FALSE);
- goto my_exit;
- }
- //越界,显示提示
- if(bHead>=94||bHead<0) {
- MessageBeep(0xFFFFFFFF );
- _tcscpy(YJMMessage,_T("(越界:有效区号范围为01-94):"));
- goto my_disp;}
- //准备备选的十个字符
- wCount = 0;
- while( wPos <= 0xFF ) {
- if(bPunctChar[YjmGBKFlag?10:(bHead>9?9:bHead)][wPos-0x40]){
- bPunct[0] = 0xA1 + bHead;
- bPunct[1] = (BYTE)wPos;
- memcpy((LPBYTE)GETLPCANDSTR(lpCandList,wCount+2),bPunct,4);
- wCount++;
- }
- wPos++;
- if(wCount == lpCandList->dwPageSize) break;
- }
- lpCandList->dwCount = wCount;
- //显示部分
- my_disp:
- lpStr1 = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr;
- if(YjmGBKFlag){_tcscpy(lpStr1,VGBKMODEL);}
- else{_tcscpy(lpStr1,VMODEL);}
- _tcscat(lpStr1,YJMMessage);
- _tcscat(lpStr1,lpStr);
- GnMsg.msg = WM_IME_COMPOSITION;
- GnMsg.wParam = 0;
- GnMsg.lParam = GCS_COMPSTR;
- GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
- //DebugLog(2,(DebugLogFile,"%d %d %d %d %s %sn",YjmGBKFlag,bHead,wPos,wStrLen,lpStr,lpStr1 ));
- my_exit:
- ImmUnlockIMCC(lpIMC->hCompStr);
- ImmUnlockIMCC(lpIMC->hCandInfo);
- ImmUnlockIMC(hIMC);
- return TRUE;
- }