📄 hzmodenormal.c
字号:
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);
if( wParam == (WORD)_T('0') ) wIdx=9;
else wIdx = wParam - (WORD)_T('1');
if(wIdx >= lpCandList->dwCount) return FALSE;
wTotal = wIdx + 1;
switch(lpPYCand->wSelectDirect){
case SELECT_FORWARD:
if(wConversionSet & CONVERSION_SET_GBK) {
wIdx += lpPYCand->awBeforePos[lpPYCand->wSelectStatus];
}
else {
if(lpPYCand->wSelectStatus) {
wIdx += lpPYCand->awBeforePos[lpPYCand->wSelectStatus];
}
else{
wIdx = lpPYCand->awBeforePos[lpPYCand->wSelectStatus];
wCount = 0;
while( wCount != wTotal) {
for(i=0;i < lpPYCand->wHZNum;i++){
if((lpPYCand->aHanZi+i)->wLen > wIdx) break;
}
#ifdef _UNICODE
if(i)
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ + (wIdx - (lpPYCand->aHanZi+i-1)->wLen),1);
else
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ + wIdx,1);
szTempStr[1] = _T('\0');
#else
if(i)
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ + 2*(wIdx - (lpPYCand->aHanZi+i-1)->wLen),2);
else
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ+2*wIdx,2);
szTempStr[2] = _T('\0');
#endif
if( (*((LPBYTE)szTempStr) >= GB_QUFIRST && *((LPBYTE)szTempStr) <= GB_QULAST) &&
(*((LPBYTE)szTempStr+1) >= GB_WEIFIRST && *((LPBYTE)szTempStr+1) <= GB_WEILAST) ) {
wCount++;
}
wIdx++;
}
wIdx--;
}
}
break;
case SELECT_BACKWARD:
if(wConversionSet & CONVERSION_SET_GBK) {
wIdx += lpPYCand->awCurrentPos[lpPYCand->wSelectStatus]+1;
}
else {
if(lpPYCand->wSelectStatus) {
wIdx += lpPYCand->awCurrentPos[lpPYCand->wSelectStatus]+1;
}
else{
wIdx = lpPYCand->awBeforePos[lpPYCand->wSelectStatus];
wTotal--;
wCount = 10;
while( wCount != wTotal) {
for(i=0;i < lpPYCand->wHZNum;i++){
if((lpPYCand->aHanZi+i)->wLen > wIdx) break;
}
#ifdef _UNICODE
if(i)
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ + (wIdx - (lpPYCand->aHanZi+i-1)->wLen),1);
else
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ + wIdx,1);
szTempStr[1] = _T('\0');
#else
if(i)
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ + 2*(wIdx - (lpPYCand->aHanZi+i-1)->wLen),2);
else
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ+2*wIdx,2);
szTempStr[2] = _T('\0');
#endif
if( (*((LPBYTE)szTempStr) >= GB_QUFIRST && *((LPBYTE)szTempStr) <= GB_QULAST) &&
(*((LPBYTE)szTempStr+1) >= GB_WEIFIRST && *((LPBYTE)szTempStr+1) <= GB_WEILAST) ) {
wCount--;
}
wIdx--;
}
wIdx++;
}
}
break;
default:
break;
}
awLen[1] = lpPYCand->wPhraseNum;
awLen[0] = (lpPYCand->aHanZi + lpPYCand->wHZNum - 1)->wLen;
if(0 < wIdx < awLen[lpPYCand->wSelectStatus]){
if(lpPYCand->wSelectStatus){
_tcscpy(szTempStr,(lpPYCand->aPhrase+wIdx)->lpHZPH->szHZ);
_tcscat(lpConvStr,szTempStr);
lpPYCand ->abKey[0] |=
(lpPYCand->aPhrase+wIdx)->lpKeyPH->abKey[0] << lpPYCand->wKeyLen;
for(i=1;i<=(lpPYCand->aPhrase+wIdx)->lpKeyPH->wLen;i++){
lpPYCand ->abKey[(lpPYCand->wKeyLen++) + 1] =
(lpPYCand->aPhrase+wIdx)->lpKeyPH->abKey[i];
}
}
else{
for(i=0;i < lpPYCand->wHZNum;i++){
if((lpPYCand->aHanZi+i)->wLen > wIdx ) break;
}
#ifdef _UNICODE
if(i)
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ + (wIdx - (lpPYCand->aHanZi+i-1)->wLen),1);
else
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ + wIdx,1);
szTempStr[1] = _T('\0');
#else
if(i)
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ + 2*(wIdx - (lpPYCand->aHanZi+i-1)->wLen),2);
else
_tcsncpy(szTempStr,(lpPYCand->aHanZi+i)->lpHZ+2*wIdx,2);
szTempStr[2] = _T('\0');
#endif
_tcscat(lpConvStr,szTempStr);
lpPYCand ->abKey[0] |= ((lpPYCand->aHanZi+i)->wKey & 0x0100) >>(8 - lpPYCand->wKeyLen);
lpPYCand ->abKey[(lpPYCand->wKeyLen++) + 1] = (BYTE)(lpPYCand->aHanZi+i)->wKey & 0xff;
}
#ifdef _UNICODE
if( EffectPYArrayLen(lpPYArray,MAX_PY_LEN,*lpwPYArrayLen) == _tcslen(lpConvStr) ) {
if(_tcslen(szTempStr) == _tcslen(lpConvStr) && lpPYCand->wSelectStatus)
(lpPYCand->aPhrase + wIdx)->lpHZPH->wAttrib++;
else if(_tcslen(lpConvStr) > 1)
SavePhToMapFile(lpConvStr,lpPYCand->abKey,(WORD)(_tcslen(lpConvStr)),1);
#else
if( EffectPYArrayLen(lpPYArray,MAX_PY_LEN,*lpwPYArrayLen) == _tcslen(lpConvStr)/2 ) {
if(_tcslen(szTempStr) == _tcslen(lpConvStr) && lpPYCand->wSelectStatus)
(lpPYCand->aPhrase + wIdx)->lpHZPH->dwAttrib++;
else if(_tcslen(lpConvStr) > 2)
SavePhToMapFile(lpConvStr,lpPYCand->abKey,(WORD)(_tcslen(lpConvStr)/2),1);
#endif
MakeResultString(hIMC,TRUE);
goto my_exit;
}
else{
#ifdef _UNICODE
wPosSpan = CalculatePosSpan(lpPYArray+(*lpwPYArrayCurPos)*MAX_PY_LEN,
MAX_PY_LEN,(WORD)((*lpwPYArrayLen)-(*lpwPYArrayCurPos)),(WORD)_tcslen(szTempStr));
#else
wPosSpan = CalculatePosSpan(lpPYArray+(*lpwPYArrayCurPos)*MAX_PY_LEN,
MAX_PY_LEN,(WORD)((*lpwPYArrayLen)-(*lpwPYArrayCurPos)),(WORD)(_tcslen(szTempStr)/2));
#endif
*lpwPYArrayCurPos += wPosSpan;
*lpwUnConvPos = CalculateUnConvPos(lpPYArray + (*lpwPYArrayCurPos)*MAX_PY_LEN,
MAX_PY_LEN,(WORD)((*lpwPYArrayLen)-(*lpwPYArrayCurPos)),lpStr);
*lpwEditCaret = (SHORT)_tcslen(lpStr);
ConvertPY( lpPYArray + (*lpwPYArrayCurPos)*MAX_PY_LEN,
MAX_PY_LEN,(WORD)((*lpwPYArrayLen)-(*lpwPYArrayCurPos)),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);
my_exit:
ImmUnlockIMCC(lpIMC->hCandInfo);
ImmUnlockIMCC(lpIMC->hCompStr);
ImmUnlockIMC(hIMC);
return TRUE;
}
BOOL DeletePhrase(HIMC hIMC,WORD wParam)
{
LPINPUTCONTEXT lpIMC;
LPCANDIDATEINFO lpCandInfo;
LPCANDIDATELIST lpCandList;
LPFREEPYCAND lpPYCand;
LPKEYPH lpKPh;
LPHZPH lpHZPh,lpCurHZPh,lpPreHZPh;
WORD wLen,wIdx;
WORD wRet = 0;
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);
if( ! lpPYCand->wSelectStatus ) {
ImmUnlockIMCC(lpIMC->hCandInfo);
ImmUnlockIMC(hIMC);
return FALSE;
}
switch( wParam ) {
case _T('!'):
wIdx = 0;
break;
case _T('@'):
wIdx = 1;
break;
case _T('#'):
wIdx = 2;
break;
case _T('$'):
wIdx = 3;
break;
case _T('%'):
wIdx = 4;
break;
case _T('^'):
wIdx = 5;
break;
case _T('&'):
wIdx = 6;
break;
case _T('*'):
wIdx = 7;
break;
case _T('('):
wIdx = 8;
break;
case _T(')'):
wIdx = 9;
break;
default:
wIdx = 0;
break;
}
switch(lpPYCand->wSelectDirect){
case SELECT_FORWARD:
wIdx += lpPYCand->awBeforePos[lpPYCand->wSelectStatus];
break;
case SELECT_BACKWARD:
wIdx += lpPYCand->awCurrentPos[lpPYCand->wSelectStatus]+1;
break;
default:
break;
}
wLen = lpPYCand->wPhraseNum;
if(0 < wIdx < wLen ){
lpKPh = (lpPYCand->aPhrase+wIdx)->lpKeyPH;
lpHZPh = (lpPYCand->aPhrase+wIdx)->lpHZPH;
if( ((LPBYTE)lpKPh >= (LPBYTE)lpMapFileBase
&& (LPBYTE)lpKPh < (LPBYTE)lpMapFileBase + MAX_PY_NUM*sizeof(KEYPH) ) ||
((LPBYTE)lpKPh >= (LPBYTE)lpMapFileBase + 2*MAX_PY_NUM*sizeof(KEYPH)
&&(LPBYTE)lpKPh < (LPBYTE)lpMapFileBase + dwMapFileUsrOffset ) ) {
lpHZPh->dwAttrib = 0;
wRet = 1;
}
else{
lpCurHZPh = lpKPh->lpHZPH;
if( lpCurHZPh == lpHZPh) {
if(lpHZPh->lpNext == NULL) lpKPh->wLen = -1;
lpKPh->lpHZPH = lpHZPh->lpNext;
wRet = 1;
}
else {
lpPreHZPh = lpCurHZPh;
do {
lpCurHZPh = lpCurHZPh->lpNext;
if(lpCurHZPh == lpHZPh) {
lpPreHZPh->lpNext = lpCurHZPh->lpNext;
wRet = 1;
break;
}
lpPreHZPh = lpCurHZPh;
}while(lpCurHZPh->lpNext != NULL);
}
}
}
if( wRet ) MakeResultString(hIMC,FALSE);
ImmUnlockIMCC(lpIMC->hCandInfo);
ImmUnlockIMC(hIMC);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -