/*++ Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved Module Name: COMPOSE.C ++*/ #include #include #include void PASCAL EngChCand( LPCOMPOSITIONSTRING lpCompStr, LPCANDIDATELIST lpCandList, LPPRIVCONTEXT lpImcP, LPINPUTCONTEXT lpIMC, WORD wCharCode) { int i; if (MBIndex.IMEChara[0].IC_Trace) { MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, BOX_UI); } else { MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, LIN_UI); } // if((lpCandList->dwCount = (DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Cnt) == 0) { } else { lstrcpy((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[0]), (LPTSTR)lpImcP->PrivateArea.Comp_Context.szSelectBuffer); for (i=1;iPrivateArea.Comp_Context.Candi_Cnt;i++) { lpCandList->dwOffset[i] = lpCandList->dwOffset[0] +(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Pos[(i+1)%10]*sizeof(TCHAR) ; *((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[i])-1) = TEXT('\0'); } } return; } /**********************************************************************/ /* Engine() */ /* Description: */ /* search MB and fill lpCompStr and lpCandList */ /**********************************************************************/ UINT PASCAL Engine( LPCOMPOSITIONSTRING lpCompStr, LPCANDIDATELIST lpCandList, LPPRIVCONTEXT lpImcP, LPINPUTCONTEXT lpIMC, WORD wCharCode) { int i; if(wCharCode == VK_ESCAPE) { lpCandList->dwCount = 0; if (MBIndex.IMEChara[0].IC_Trace) { MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, BOX_UI); } else { MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, LIN_UI); } return (ENGINE_ESC); } else if(wCharCode == TEXT('\b')) { EngChCand(lpCompStr, lpCandList, lpImcP, lpIMC, wCharCode); return (ENGINE_BKSPC); } else if((wCharCode == 0x21) || (wCharCode == 0x22) || (wCharCode == 0x23) || (wCharCode == 0x24)) { EngChCand(lpCompStr, lpCandList, lpImcP, lpIMC, wCharCode); return (ENGINE_CHCAND); } else if ((wCharCode >= TEXT('0') && wCharCode <= TEXT('9')) && (lpImcP->iImeState == CST_CHOOSE)) { lpCandList->dwCount = lpImcP->PrivateArea.Comp_Context.Candi_Cnt; lpImcP->dwOldCandCnt = lpCandList->dwCount; if (MBIndex.IMEChara[0].IC_Trace) { MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 1, BOX_UI); } else { MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 1, LIN_UI); } // if LX on, set cand if(!(MBIndex.IMEChara[0].IC_LX) ||!(lpImcP->PrivateArea.Comp_Status.dwSTLX)) { } else { lpCandList->dwCount = (DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Cnt; lstrcpy((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[0]), (LPTSTR)lpImcP->PrivateArea.Comp_Context.szSelectBuffer); for (i=1;iPrivateArea.Comp_Context.Candi_Cnt;i++) { lpCandList->dwOffset[i] = lpCandList->dwOffset[0] +(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Pos[(i+1)%10]*sizeof(TCHAR); *((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[i])-1) = TEXT('\0'); } } return (ENGINE_MULTISEL); } else { UINT MB_SUB_RET; if(IsUsedCode(wCharCode, lpImcP) || (wCharCode == MBIndex.MBDesc[0].cWildChar) || (wCharCode == TEXT(' '))) { if((wCharCode != TEXT(' ')) && (wCharCode != TEXT('?')) && (lpImcP->PrivateArea.Comp_Status.dwSTMULCODE)) { if (MBIndex.IMEChara[0].IC_Trace) { MB_SUB(lpIMC->hPrivate, 0x20, 0, BOX_UI); } else { MB_SUB(lpIMC->hPrivate, 0x20, 0, LIN_UI); } // online create word if(lpImcP->PrivateArea.Comp_Status.OnLineCreWord) { UINT i, j; for(i=lstrlen(CWDBCSStr), j=0; iPrivateArea.Comp_Context.CKBBuf[j]; } } if(MBIndex.IMEChara[0].IC_INSSPC) { int i,j, ilen; ilen = lstrlen(lpImcP->PrivateArea.Comp_Context.CKBBuf); lpImcP->PrivateArea.Comp_Context.CKBBuf[ilen + ilen/2] = 0; for(i = ilen, j=3*ilen/2; i>2; i-=2, j-=3) { lpImcP->PrivateArea.Comp_Context.CKBBuf[j-1] = 0x20; lpImcP->PrivateArea.Comp_Context.CKBBuf[j-2] = lpImcP->PrivateArea.Comp_Context.CKBBuf[i-1]; lpImcP->PrivateArea.Comp_Context.CKBBuf[j-3] = lpImcP->PrivateArea.Comp_Context.CKBBuf[i-2]; } lpImcP->PrivateArea.Comp_Context.CKBBuf[i] = 0x20; } else { } lstrcpy((LPTSTR)((LPBYTE)lpCompStr + lpCompStr->dwResultStrOffset), lpImcP->PrivateArea.Comp_Context.CKBBuf); // calculate result string length lpCompStr->dwResultStrLen = lstrlen(lpImcP->PrivateArea.Comp_Context.CKBBuf); lpImcP->fdwGcsFlag |= GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS| GCS_DELTASTART|GCS_RESULTREAD|GCS_RESULT; #ifdef CROSSREF CrossReverseConv(lpIMC, lpCompStr, lpImcP, lpCandList); #endif } if (MBIndex.IMEChara[0].IC_Trace) { MB_SUB_RET = MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, BOX_UI); } else { MB_SUB_RET = MB_SUB(lpIMC->hPrivate, (TCHAR)wCharCode, 0, LIN_UI); } switch (MB_SUB_RET) { case (ENGINE_COMP): //Engine is composeing if((lpCandList->dwCount = (DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Cnt) == 0) { } else { lstrcpy((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[0]), (LPTSTR)lpImcP->PrivateArea.Comp_Context.szSelectBuffer); for (i=1;iPrivateArea.Comp_Context.Candi_Cnt;i++) { lpCandList->dwOffset[i] = lpCandList->dwOffset[0] +(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Pos[(i+1)%10]*sizeof(TCHAR); *((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[i])-1) = TEXT('\0'); } } return (ENGINE_COMP); case (ENGINE_ASCII): //Can't compose return ENGINE_ASCII; case (ENGINE_RESAULT): //Composition complete and Result string available InitCompStr(lpCompStr); // online create word if(lpImcP->PrivateArea.Comp_Status.OnLineCreWord) { UINT i, j; for(i=lstrlen(CWDBCSStr), j=0; iPrivateArea.Comp_Context.CKBBuf[j]; } } if(MBIndex.IMEChara[0].IC_INSSPC) { int i,j, ilen; ilen = lstrlen(lpImcP->PrivateArea.Comp_Context.CKBBuf); lpImcP->PrivateArea.Comp_Context.CKBBuf[ilen + ilen/2] = 0; for(i = ilen, j=3*ilen/2; i>2; i-=2, j-=3) { lpImcP->PrivateArea.Comp_Context.CKBBuf[j-1] = 0x20; lpImcP->PrivateArea.Comp_Context.CKBBuf[j-2] = lpImcP->PrivateArea.Comp_Context.CKBBuf[i-1]; lpImcP->PrivateArea.Comp_Context.CKBBuf[j-3] = lpImcP->PrivateArea.Comp_Context.CKBBuf[i-2]; } lpImcP->PrivateArea.Comp_Context.CKBBuf[i] = 0x20; } else { } lstrcpy((LPTSTR)((LPBYTE)lpCompStr + lpCompStr->dwResultStrOffset), lpImcP->PrivateArea.Comp_Context.CKBBuf); // calculate result string length lpCompStr->dwResultStrLen = lstrlen(lpImcP->PrivateArea.Comp_Context.CKBBuf); #ifdef CROSSREF CrossReverseConv(lpIMC, lpCompStr, lpImcP, lpCandList); #endif // if LX on, set cand if(!(MBIndex.IMEChara[0].IC_LX) ||!(lpImcP->PrivateArea.Comp_Status.dwSTLX)) { } else { lpCandList->dwCount = (DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Cnt; lstrcpy((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[0]), (LPTSTR)lpImcP->PrivateArea.Comp_Context.szSelectBuffer); for (i=1;iPrivateArea.Comp_Context.Candi_Cnt;i++) { lpCandList->dwOffset[i] = lpCandList->dwOffset[0] +(DWORD)lpImcP->PrivateArea.Comp_Context.Candi_Pos[(i+1)%10]*sizeof(TCHAR); *((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[i])-1) = TEXT('\0'); } } return (ENGINE_RESAULT); default: return (ENGINE_COMP); } } else { return (ENGINE_COMP); } } } /**********************************************************************/ /* CompEscapeKey() */ /**********************************************************************/ void PASCAL CompEscapeKey( LPINPUTCONTEXT lpIMC, LPCOMPOSITIONSTRING lpCompStr, LPGUIDELINE lpGuideLine, LPPRIVCONTEXT lpImcP) { // add temp lpImcP->PrivateArea.Comp_Context.szInBuffer[0] = 0; lpImcP->PrivateArea.Comp_Context.PromptCnt = 0; lpImcP->PrivateArea.Comp_Status.dwInvalid = 0; if (!lpGuideLine) { MessageBeep((UINT)-1); } else if (lpGuideLine->dwLevel == GL_LEVEL_NOGUIDELINE) { } else { lpGuideLine->dwLevel = GL_LEVEL_NOGUIDELINE; lpGuideLine->dwIndex = GL_ID_UNKNOWN; lpGuideLine->dwStrLen = 0; lpImcP->fdwImeMsg |= MSG_GUIDELINE; } if (lpImcP->iImeState == CST_CHOOSE) { Finalize(lpIMC, lpCompStr, lpImcP, VK_ESCAPE); } else if (lpImcP->fdwImeMsg & MSG_ALREADY_START) { lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_END_COMPOSITION) & ~(MSG_START_COMPOSITION); } lpImcP->iImeState = CST_INIT; if (lpCompStr) { InitCompStr(lpCompStr); lpImcP->fdwImeMsg |= MSG_COMPOSITION; lpImcP->dwCompChar = VK_ESCAPE; lpImcP->fdwGcsFlag |= (GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS| GCS_DELTASTART); } return; } /**********************************************************************/ /* CompBackSpaceKey() */ /**********************************************************************/ void PASCAL CompBackSpaceKey( LPINPUTCONTEXT lpIMC, LPCOMPOSITIONSTRING lpCompStr, LPPRIVCONTEXT lpImcP) { if (lpCompStr->dwCursorPos < sizeof(BYTE)) { lpCompStr->dwCursorPos = sizeof(BYTE); } // go back a compsoition char lpCompStr->dwCursorPos -= sizeof(BYTE); // clean the sequence code lpImcP->fdwImeMsg |= MSG_COMPOSITION; lpImcP->dwCompChar = TEXT('\b'); lpImcP->fdwGcsFlag |= (GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS| GCS_DELTASTART); if (!lpCompStr->dwCursorPos) { if ((lpImcP->fdwImeMsg & (MSG_ALREADY_OPEN)) || (lpImcP->PrivateArea.Comp_Status.dwInvalid) || (lpImcP->iImeState != CST_INIT)) { lpImcP->iImeState = CST_INIT; ClearCand(lpIMC); lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) & ~(MSG_OPEN_CANDIDATE); if(!(lpImcP->PrivateArea.Comp_Status.dwSTLX)) { lpCompStr->dwCompReadStrLen = lpCompStr->dwCompStrLen = lpCompStr->dwDeltaStart = lpCompStr->dwCursorPos; Finalize(lpIMC, lpCompStr, lpImcP, TEXT('\b')); lpImcP->PrivateArea.Comp_Status.dwInvalid = 0; } return; } lpImcP->iImeState = CST_INIT; if (lpImcP->fdwImeMsg & MSG_ALREADY_START) { InitCompStr(lpCompStr); lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_END_COMPOSITION) & ~(MSG_START_COMPOSITION); return; } } #ifdef EUDC if (lpIMC->fdwConversion & IME_CMODE_EUDC) { }else{ #endif //EUDC // chang candidate by backspace if (MBIndex.IMEChara[0].IC_TS) { lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_OPEN_CANDIDATE | MSG_CHANGE_CANDIDATE) & ~(MSG_CLOSE_CANDIDATE); } else { if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) { lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) & ~(MSG_OPEN_CANDIDATE); } } #ifdef EUDC } #endif//EUDC // reading string is composition string for some simple IMEs // delta start is the same as cursor position for backspace lpCompStr->dwCompReadStrLen = lpCompStr->dwCompStrLen = lpCompStr->dwDeltaStart = lpCompStr->dwCursorPos; Finalize(lpIMC, lpCompStr, lpImcP, TEXT('\b')); return; } /**********************************************************************/ /* CompStrInfo() */ /**********************************************************************/ void PASCAL CompStrInfo( LPCOMPOSITIONSTRING lpCompStr, LPPRIVCONTEXT lpImcP, LPGUIDELINE lpGuideLine, WORD wCharCode) { register DWORD dwCursorPos; // multicode if(lpImcP->PrivateArea.Comp_Status.dwSTMULCODE) { InitCompStr(lpCompStr); } // dwCursorPos = lpCompStr->dwCursorPos; // dwCrusorPos limit if (dwCursorPos >= MBIndex.MBDesc[0].wMaxCodes) { // exceed the max input key limitation lpGuideLine->dwLevel = GL_LEVEL_ERROR; lpGuideLine->dwIndex = GL_ID_TOOMANYSTROKE; lpImcP->fdwImeMsg |= MSG_GUIDELINE; MessageBeep(0xFFFFFFFF); return; } // set MSG_START_COMPOSITION if (!(lpImcP->fdwImeMsg & MSG_ALREADY_START)) { lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_START_COMPOSITION) & ~(MSG_END_COMPOSITION); } if (lpImcP->iImeState == CST_INIT) { } // composition/reading string - UsedCode(Full Shape) lpImcP->dwCompChar = (DWORD)wCharCode; // set reading string for lpCompStr *((LPUNAWORD)((LPBYTE)lpCompStr + lpCompStr->dwCompReadStrOffset + dwCursorPos*sizeof(TCHAR))) = (BYTE)lpImcP->dwCompChar; // composition/reading attribute - IME has converted these chars *((LPUNAWORD)((LPBYTE)lpCompStr + lpCompStr->dwCompReadAttrOffset + dwCursorPos*sizeof(TCHAR))) = ((ATTR_TARGET_CONVERTED << 8)|ATTR_TARGET_CONVERTED); // set reading string lenght for lpCompStr if (lpCompStr->dwCompReadStrLen <= dwCursorPos) { lpCompStr->dwCompReadStrLen += sizeof(BYTE); } // composition string is reading string for some simple IMEs lpCompStr->dwCompStrLen = lpCompStr->dwCompReadStrLen; // composition/reading attribute length is equal to reading string length lpCompStr->dwCompReadAttrLen = lpCompStr->dwCompReadStrLen; lpCompStr->dwCompAttrLen = lpCompStr->dwCompStrLen; // delta start from previous cursor position lpCompStr->dwDeltaStart = lpCompStr->dwCursorPos; // set new cursor with next to the composition string lpCompStr->dwCursorPos = lpCompStr->dwCompStrLen; // tell app, there is a composition char generated lpImcP->fdwImeMsg |= MSG_COMPOSITION; // set lpImeP->fdwGcsFlag lpImcP->fdwGcsFlag |= GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS|GCS_DELTASTART; return; } /**********************************************************************/ /* Finalize() */ /* Return vlaue */ /* Engine Flag */ /* Description: */ /* Call Engine finalize Chinese word(s) by searching table */ /* (Set lpCompStr and lpCandList) */ /* Set lpImeP(iImeState, fdwImeMsg, fdwGcsFlag) */ /**********************************************************************/ UINT PASCAL Finalize( LPINPUTCONTEXT lpIMC, LPCOMPOSITIONSTRING lpCompStr, LPPRIVCONTEXT lpImcP, WORD wCharCode) { LPCANDIDATEINFO lpCandInfo; LPCANDIDATELIST lpCandList; UINT fEngine; if (!lpIMC->hCandInfo) { return (0); } // get lpCandInfo lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo); if (!lpCandInfo) { return (0); } // get lpCandList and init dwCount & dwSelection lpCandList = (LPCANDIDATELIST) ((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]); lpCandList->dwCount = 0; lpCandList->dwSelection = 0; // search the IME tables fEngine =Engine(lpCompStr, lpCandList, lpImcP, lpIMC, wCharCode); if (fEngine == ENGINE_COMP) { lpCandInfo->dwCount = 1; if(lpCandList->dwCount == 0) { MessageBeep((UINT)-1); lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) & ~(MSG_OPEN_CANDIDATE); ImmUnlockIMCC(lpIMC->hCandInfo); return (fEngine); } else { // open composition candidate UI window for the string(s) if ((MBIndex.IMEChara[0].IC_TS) || (lpImcP->PrivateArea.Comp_Status.dwSTMULCODE)) { if ((lpImcP->fdwImeMsg & (MSG_ALREADY_OPEN|MSG_CLOSE_CANDIDATE)) == (MSG_ALREADY_OPEN|MSG_CLOSE_CANDIDATE)) { lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CHANGE_CANDIDATE) & ~(MSG_CLOSE_CANDIDATE); } else if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) { lpImcP->fdwImeMsg |= MSG_CHANGE_CANDIDATE; } else { lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_OPEN_CANDIDATE) & ~(MSG_CLOSE_CANDIDATE); } } else { if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) { lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) & ~(MSG_OPEN_CANDIDATE); } } } if (lpImcP->fdwImeMsg & MSG_ALREADY_START) { lpImcP->fdwImeMsg |= MSG_COMPOSITION; } } else if (fEngine == ENGINE_ASCII) { } else if (fEngine == ENGINE_RESAULT) { // Set lpImep! and tell application, there is a reslut string lpImcP->fdwImeMsg |= MSG_COMPOSITION; lpImcP->dwCompChar = (DWORD) 0; lpImcP->fdwGcsFlag |= GCS_COMPREAD|GCS_COMP|GCS_CURSORPOS| GCS_DELTASTART|GCS_RESULTREAD|GCS_RESULT; if(!(MBIndex.IMEChara[0].IC_LX) || !(lpImcP->PrivateArea.Comp_Status.dwSTLX)) { if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) { lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) & ~(MSG_OPEN_CANDIDATE); } // clear candidate now lpCandList->dwCount = 0; // set iImeState with CST_INIT lpImcP->iImeState = CST_INIT; } else { if ((MBIndex.IMEChara[0].IC_TS) || (lpImcP->PrivateArea.Comp_Status.dwSTLX)) { if ((lpImcP->fdwImeMsg & (MSG_ALREADY_OPEN|MSG_CLOSE_CANDIDATE)) == (MSG_ALREADY_OPEN|MSG_CLOSE_CANDIDATE)) { lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CHANGE_CANDIDATE) & ~(MSG_CLOSE_CANDIDATE); } else if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) { lpImcP->fdwImeMsg |= MSG_CHANGE_CANDIDATE; } else { lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_OPEN_CANDIDATE) & ~(MSG_CLOSE_CANDIDATE); } lpImcP->iImeState = CST_INIT; } else { } } } else if (fEngine == ENGINE_CHCAND) { } else if (fEngine == ENGINE_MULTISEL) { } else if (fEngine == ENGINE_ESC) { } else if (fEngine == ENGINE_BKSPC) { } else { } ImmUnlockIMCC(lpIMC->hCandInfo); return fEngine; } /**********************************************************************/ /* CompWord() */ /**********************************************************************/ void PASCAL CompWord( // compose the Chinese word(s) according to // input key WORD wCharCode, LPINPUTCONTEXT lpIMC, LPCOMPOSITIONSTRING lpCompStr, LPPRIVCONTEXT lpImcP, LPGUIDELINE lpGuideLine) { // lpComStr=NULL? if (!lpCompStr) { MessageBeep((UINT)-1); return; } // escape key if ((wCharCode == VK_ESCAPE) || (wCharCode == 0x0d)) { lpImcP->iImeState = CST_INIT; CompEscapeKey(lpIMC, lpCompStr, lpGuideLine, lpImcP); return; } // GuideLine if (!lpGuideLine) { } else if (lpGuideLine->dwLevel == GL_LEVEL_NOGUIDELINE) { lpGuideLine->dwStrLen = 0; } else { // previous input error cause us trancate some chars if (lpGuideLine->dwLevel == GL_LEVEL_ERROR) { lpCompStr->dwCompReadStrLen = lpCompStr->dwCompStrLen = lpCompStr->dwCursorPos; lpCompStr->dwCompReadAttrLen = lpCompStr->dwCompReadStrLen; lpCompStr->dwCompAttrLen = lpCompStr->dwCompStrLen; } lpGuideLine->dwLevel = GL_LEVEL_NOGUIDELINE; lpGuideLine->dwIndex = GL_ID_UNKNOWN; lpGuideLine->dwStrLen = 0; lpImcP->fdwImeMsg |= MSG_GUIDELINE; } // backspace key if (wCharCode == TEXT('\b')) { CompBackSpaceKey(lpIMC, lpCompStr, lpImcP); return; } lpImcP->iImeState = CST_INPUT; if(wCharCode == TEXT(' ')) { #ifdef EUDC }else if( lpIMC->fdwConversion & IME_CMODE_EUDC && lpCompStr->dwCompReadStrLen >= EUDC_MAX_READING ){ MessageBeep((UINT)-1); #endif //EUDC } else { // build up composition string info CompStrInfo(lpCompStr, lpImcP, lpGuideLine, wCharCode); } #ifdef EUDC if (lpIMC->fdwConversion & IME_CMODE_EUDC) { if (lpCompStr->dwCompReadStrLen >= lpImeL->nMaxKey || lpCompStr->dwCompReadStrLen >= EUDC_MAX_READING || wCharCode == TEXT(' ')) { lpImcP->fdwImeMsg |= MSG_COMPOSITION; lpImcP->fdwGcsFlag |= GCS_RESULTREAD|GCS_RESULTSTR; } } else #endif //EUDC Finalize(lpIMC, lpCompStr, lpImcP, wCharCode); // compsition return; }