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

📄 hzmodenormal.c

📁 拼音输入法源码vc开发的
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * 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"

BOOL CharHandleNormal( HIMC hIMC,WORD wParam,LONG lParam)
{
	if( (wParam >= _T('a') && wParam <= _T('z')) || wParam == _T('\'') ) {
		return AddChar(hIMC,wParam,EDIT_ADD);
	}
	else if( wParam == _T('=') || wParam == _T('.') || wParam == _T('>')) {
		return ForwardPage(hIMC);
	}

	else if( wParam == _T('-') || wParam == _T(',') || wParam == _T('<')) {
		return BackwardPage(hIMC);
	}
	else if( wParam >= _T('0') && wParam <= _T('9') ){
		return SelectCand(hIMC,wParam);
	}
	switch ( wParam ){
	case _T('!'):
	case _T('@'):
	case _T('#'):
	case _T('$'):
	case _T('%'):
	case _T('^'):
	case _T('&'):
	case _T('*'):
	case _T('('):
	case _T(')'):
		return DeletePhrase(hIMC,wParam);
	default:
		break;
	}
	return FALSE;
}

BOOL AddChar( HIMC hIMC, WORD wCode, WORD wEditMode)
{
    LPINPUTCONTEXT lpIMC;
    LPCOMPOSITIONSTRING lpCompStr;
	LPCANDIDATEINFO lpCandInfo;
	LPCANDIDATELIST lpCandList;
	LPFREEPYCAND lpPYCand;

	LPTSTR lpStr;
	LPTSTR lpConvStr;
	LPTSTR lpPaintStr;
	TCHAR  szTemp[150];
    GENEMSG GnMsg;
	LPTSTR lpPYArray;
	WORD *lpwPYArrayLen;
	WORD *lpwPYArrayCurPos;
	SHORT *lpwUnConvPos;
	SHORT *lpwEditCaret;
	TCHAR cTempChar;
	WORD wPYCount;
	int i;
	BOOL fRet = FALSE;
	TCHAR szPreStr[150];
	WORD  wPreUnConvPos;
	WORD  wPreEditCaret;

    lpIMC = ImmLockIMC(hIMC);

	lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
	lpStr = GETLPCOMPSTR(lpCompStr);
	lpConvStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szConvCompStr;
	lpPaintStr = ((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPaintCompStr;
	lpPYArray = (LPTSTR)(((LPMYCOMPSTR)lpCompStr)->FreePYComp.szPYArray);
	lpwPYArrayLen = &(((LPMYCOMPSTR)lpCompStr)->FreePYComp.wPYArrayLen);
	lpwPYArrayCurPos = &(((LPMYCOMPSTR)lpCompStr)->FreePYComp.wPYArrayCurPos);
	lpwUnConvPos = &(((LPMYCOMPSTR)lpCompStr)->FreePYComp.wUnConvPos);
	lpwEditCaret = &(((LPMYCOMPSTR)lpCompStr)->FreePYComp.wEditCaret);

	_tcscpy(szPreStr,lpStr);
	wPreUnConvPos = *lpwUnConvPos;
	wPreEditCaret = *lpwEditCaret;

    if( wEditMode == EDIT_BACK ){
		if(!_tcslen(lpStr) || (*lpwEditCaret) < 1 ){
			MessageBeep(0xFFFFFFFF );
			fRet = TRUE;
			goto my_exit;
		}
		else if(*lpwEditCaret <= *lpwUnConvPos){
			*lpConvStr = _T('\0');
			*lpwUnConvPos = 0;
		}
		else{
			_tcscpy(szTemp,lpStr + *lpwEditCaret);
			_tcscpy(lpStr + *lpwEditCaret -1,szTemp);
			*lpwEditCaret -= 1;
			if( !_tcslen(lpStr)){
				MakeResultString(hIMC,FALSE);
				fRet = TRUE;
				goto my_exit;
			}
		}
    }
    else if( wEditMode == EDIT_DELETE ){
		if(!_tcslen(lpStr) || (*lpwEditCaret) == (SHORT)_tcslen(lpStr) ){
			MessageBeep(0xFFFFFFFF );
			fRet = TRUE;
			goto my_exit;
		}
		else{
			_tcscpy(szTemp,lpStr + *lpwEditCaret + 1);
			_tcscpy(lpStr + *lpwEditCaret,szTemp);
			if( !_tcslen(lpStr)){
				MakeResultString(hIMC,FALSE);
				fRet = TRUE;
				goto my_exit;
			}
		}
    }
    else if( wEditMode == EDIT_ADD ){
		_tcscpy(szTemp,lpStr + *lpwEditCaret);
		*(lpStr + *lpwEditCaret) = (TCHAR)wCode;
		_tcscpy(lpStr + *lpwEditCaret +1,szTemp);
		*lpwEditCaret += 1;
    }
	else{
		MessageBeep(0xFFFFFFFF );
		fRet = TRUE;
		goto my_exit;
	}

    lpCompStr->dwCompStrLen = _tcslen(lpStr);


    if(!_tcslen(lpConvStr)){
		*lpwPYArrayCurPos = 0;
    }
	
    wPYCount=ParsePY(lpStr + *lpwUnConvPos,lpPYArray + (*lpwPYArrayCurPos)*MAX_PY_LEN,MAX_PY_LEN);
	
	*lpwPYArrayLen = *lpwPYArrayCurPos + wPYCount;
	i = *lpwPYArrayLen;
	while(i--){
		if((cTempChar = *(lpPYArray + i*MAX_PY_LEN)) == _T('i') || 
				cTempChar == _T('u') || cTempChar == _T('v') ){
			_tcscpy(lpStr,szPreStr);
			*lpwEditCaret = wPreEditCaret;
			*lpwUnConvPos = wPreUnConvPos;
			*lpwPYArrayLen = *lpwPYArrayLen - 1;
			MessageBeep(0xFFFFFFFF );
			fRet = TRUE;
			goto my_exit;
		}
	}
	
    if(EffectPYArrayLen(lpPYArray,MAX_PY_LEN,*lpwPYArrayLen) > MAX_PHRASE_LEN) {
		_tcscpy(lpStr,szPreStr);
		*lpwEditCaret = wPreEditCaret;
		*lpwUnConvPos = wPreUnConvPos;
		*lpwPYArrayLen = *lpwPYArrayLen - 1;
		MessageBeep(0xFFFFFFFF );
		fRet = TRUE;
		goto my_exit;
    }
	lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
	lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo  + lpCandInfo->dwOffset[0]);
	lpPYCand = (LPFREEPYCAND)(&((LPMYCAND)lpCandInfo)->FreePYCand);

	ConvertPY( lpPYArray + (*lpwPYArrayCurPos)*MAX_PY_LEN,
				MAX_PY_LEN,wPYCount,lpPYCand);

    lpPYCand->awBeforePos[1] = 0;
	lpPYCand->awBeforePos[0] = 0;
	lpPYCand->awCurrentPos[1] = 0;
	lpPYCand->awCurrentPos[0] = 0;
	lpPYCand->wSelectDirect = SELECT_FORWARD;
    lpPYCand->wSelectStatus = 1;

	lpCandList->dwCount = CreateCandStr(lpPYCand, SELECT_FORWARD, (LPTSTR)(((LPMYCAND)lpCandInfo)->szCandStr),MAXCANDSTRSIZE);
	lpCandList->dwPageStart = 2;
	lpCandList->dwPageSize = 10;

	CreatePaintStr( lpPYArray + (*lpwPYArrayCurPos)*MAX_PY_LEN,
			MAX_PY_LEN,(WORD)((*lpwPYArrayLen)-(*lpwPYArrayCurPos)),lpConvStr,lpPaintStr);

    GnMsg.msg = WM_IME_COMPOSITION;
    GnMsg.wParam = 0;
    GnMsg.lParam = GCS_COMPSTR;
    GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);

	ImmUnlockIMCC(lpIMC->hCandInfo);
	fRet = TRUE;
my_exit:
    ImmUnlockIMCC(lpIMC->hCompStr);
    ImmUnlockIMC(hIMC);
	return fRet;
}

BOOL ForwardPage(HIMC hIMC)
{
    LPINPUTCONTEXT lpIMC;
	LPCANDIDATEINFO lpCandInfo;
	LPCANDIDATELIST lpCandList;
	LPFREEPYCAND lpPYCand;
	GENEMSG GnMsg;

	if( !IsCompStr(hIMC) ) return FALSE;

	lpIMC = ImmLockIMC(hIMC);
	lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
	lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo  + lpCandInfo->dwOffset[0]);
	lpPYCand = (LPFREEPYCAND)(&((LPMYCAND)lpCandInfo)->FreePYCand);

	lpCandList->dwCount = 
		CreateCandStr(lpPYCand, SELECT_FORWARD, (LPTSTR)(((LPMYCAND)lpCandInfo)->szCandStr),MAXCANDSTRSIZE);
	lpCandList->dwPageStart = 2;
	lpCandList->dwPageSize = 10;

	if(lpCandList->dwCount) {
		GnMsg.msg = WM_IME_COMPOSITION;
		GnMsg.wParam = 0;
		GnMsg.lParam = GCS_COMPSTR;
		GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
	}
	ImmUnlockIMCC(lpIMC->hCandInfo);
    ImmUnlockIMC(hIMC);
	return TRUE;
}

BOOL BackwardPage(HIMC hIMC)
{
    LPINPUTCONTEXT lpIMC;
	LPCANDIDATEINFO lpCandInfo;
	LPCANDIDATELIST lpCandList;
	LPFREEPYCAND lpPYCand;
	GENEMSG GnMsg;

	if( !IsCompStr(hIMC) ) return FALSE;

	lpIMC = ImmLockIMC(hIMC);
	lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
	lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo  + lpCandInfo->dwOffset[0]);
	lpPYCand = (LPFREEPYCAND)(&((LPMYCAND)lpCandInfo)->FreePYCand);

	lpCandList->dwCount = 
		CreateCandStr(lpPYCand, SELECT_BACKWARD, (LPTSTR)(((LPMYCAND)lpCandInfo)->szCandStr),MAXCANDSTRSIZE);
	lpCandList->dwPageStart = 2;
	lpCandList->dwPageSize = 10;

	if(lpCandList->dwCount) {
		GnMsg.msg = WM_IME_COMPOSITION;
		GnMsg.wParam = 0;
		GnMsg.lParam = GCS_COMPSTR;
		GenerateMessage(hIMC, lpdwCurTransKey,(LPGENEMSG)&GnMsg);
	}

	ImmUnlockIMCC(lpIMC->hCandInfo);
    ImmUnlockIMC(hIMC);
	return TRUE;
}

BOOL SelectCand(HIMC hIMC,WORD wParam)
{
    LPINPUTCONTEXT lpIMC;
	LPCOMPOSITIONSTRING lpCompStr;
	LPCANDIDATEINFO lpCandInfo;
	LPCANDIDATELIST lpCandList;

	LPFREEPYCAND lpPYCand;

	LPTSTR lpStr;
	LPTSTR lpConvStr;
	LPTSTR lpPaintStr;
	LPTSTR lpPYArray;
	SHORT *lpwUnConvPos;
	SHORT *lpwEditCaret;
	WORD *lpwPYArrayLen;
	WORD *lpwPYArrayCurPos;
	GENEMSG GnMsg;
    WORD wIdx,awLen[2],wPosSpan,wTotal,wCount;
	TCHAR szTempStr[(MAX_PHRASE_LEN+1)*2];
	int i;

    if( !IsCompStr(hIMC) ) return FALSE;

	lpIMC = ImmLockIMC(hIMC);

	lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
	lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo  + lpCandInfo->dwOffset[0]);
	lpPYCand = (LPFREEPYCAND)(&((LPMYCAND)lpCandInfo)->FreePYCand);

	lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);

⌨️ 快捷键说明

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