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

📄 hzmodenormal.c

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