⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hzmodev.c

📁 拼音输入法源码vc开发的
💻 C
字号:
/*
 * Copyright (C) 1999.4  Li ZhenChun
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License; or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that is will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, M A 02139, USA.
 *
 * Author: Li ZhenChun  email: zhchli@163.net or zhchli@126.com
 * 
 */

#include "freepy.h"

static BYTE bPunctChar[9][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
	}
};

BOOL CharHandleV( HIMC hIMC,WORD wParam,LONG lParam)
{
    LPINPUTCONTEXT lpIMC;
	LPCANDIDATEINFO lpCandInfo;
	LPCANDIDATELIST lpCandList;
	LPCOMPOSITIONSTRING lpCompStr;
	GENEMSG GnMsg;
	WORD wCount;
	WORD wTemp;
	static BYTE bHead,bDirect;
	static WORD wPos,wPrePos;
	BYTE bPunct[4];

#define FORWARD 0x01
#define BACKWARD 0x02

	bPunct[2] = 0;
	bPunct[3] = 0;

    lpIMC = ImmLockIMC(hIMC);
	lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
	lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo  + lpCandInfo->dwOffset[0]);
	lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);

	if( !lpCandList->dwCount ){
		if( wParam >= _T('1') && wParam <= _T('9') ) {
			LPTSTR lpStr;
			WORD wStrLen;

			wPos = 0x40;
			wPrePos = 0x40;
			bDirect = FORWARD;
			bHead =(BYTE)( wParam - _T('1'));
			lpCandList->dwPageSize = 10;
			lpCandList->dwPageStart = 2;

			wCount = 0;
			while( wPos <= 0xFF ) {
				if(bPunctChar[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;

			lpStr = GETLPCOMPSTR(lpCompStr);
			wStrLen = _tcslen(lpStr);
			*(lpStr + wStrLen) = (TCHAR)wParam;
			*(lpStr + wStrLen +1) = _T('\0');

			lpStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr;
			wStrLen = _tcslen(lpStr);
			*(lpStr + wStrLen) = (TCHAR)wParam;
			*(lpStr + wStrLen +1) = _T('\0');

			GnMsg.msg = WM_IME_COMPOSITION;
			GnMsg.wParam = 0;
			GnMsg.lParam = GCS_COMPSTR;
			GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
		}
		else MessageBeep(0xFFFFFFFF );
	}
	else{
		if( wParam == _T('=') || wParam == _T('.') || wParam == _T('>')) {
			if( bDirect & BACKWARD ) {
				bDirect = FORWARD;
				wPos = wPrePos+1;
			}
			DebugLog(4,(DebugLogFile,"---forward: %lx %lx\n",wPrePos,wPos));
			if (wPos >= 0xFF ) {
				MessageBeep(0xFFFFFFFF );
				goto my_exit;
			}
			if(wPos < 0x40 ) wPos = 0x40;

			wPrePos = wPos;
			wCount = 0;
			while( wPos <= 0xFF ) {
				if(bPunctChar[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;
			DebugLog(4,(DebugLogFile,"forward: %lx %lx\n",wPrePos,wPos));
			GnMsg.msg = WM_IME_COMPOSITION;
			GnMsg.wParam = 0;
			GnMsg.lParam = GCS_COMPSTR;
			GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
		}
		else if( wParam == _T('-') || wParam == _T(',') || wParam == _T('<')) {
			TCHAR szStrArr[30][4];

			DebugLog(4,(DebugLogFile,"+++backward: %lx %lx\n",wPrePos,wPos));
			if( bDirect & FORWARD ) {
				bDirect = BACKWARD;
				wPos = wPrePos-1;
			}
			DebugLog(4,(DebugLogFile,"---backward: %lx %lx\n",wPrePos,wPos));
			if (wPos < 0x40 ) {
				MessageBeep(0xFFFFFFFF );
				goto my_exit;
			}
			if(wPos > 0xFF) wPos = 0xFF;

			wPrePos = wPos;
			wCount = 0;
			while( wPos >= 0x40 ) {
				if(bPunctChar[bHead][wPos-0x40]){
					bPunct[0] = 0xA1 + bHead;
					bPunct[1] = (BYTE)wPos;
					memcpy((LPBYTE)szStrArr[wCount],bPunct,4);
					wCount++;
				}
				wPos--;
				if(wCount == lpCandList->dwPageSize) break;
			}
			DebugLog(4,(DebugLogFile,"backward: %lx %lx\n",wPrePos,wPos));
			if( wCount == 0){
				MessageBeep(0xFFFFFFFF );
				goto my_exit;
			}
			lpCandList->dwCount = wCount;
			wTemp = 2;
			while(wCount--){
				_tcscpy(GETLPCANDSTR(lpCandList,wTemp++),szStrArr[wCount]);
			}

			GnMsg.msg = WM_IME_COMPOSITION;
			GnMsg.wParam = 0;
			GnMsg.lParam = GCS_COMPSTR;
			GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
		}
		else if( wParam >= _T('0') && wParam <= _T('9') ){
			SelectCandFromCandlist(hIMC, wParam);
		}
	}
my_exit:
	ImmUnlockIMCC(lpIMC->hCompStr);
	ImmUnlockIMCC(lpIMC->hCandInfo);
	ImmUnlockIMC(hIMC);

#undef FORWARD
#undef BACKWARD

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -