📄 hzmodenormal.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"
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 + -