📄 compose.c
字号:
DWORD i;
WORD wCode, xCode;
TCHAR ResaultStr[3];
memset(ResaultStr, 0, sizeof(ResaultStr));
if((lpImcP->bSeq[2] == TEXT('?') || wCharCode == TEXT(' '))) {
lpImcP->bSeq[2] = TEXT('0');
lpImcP->bSeq[3] = TEXT('0');
lpImcP->bSeq[4] = TEXT('\0');
wCode = UnicodeEngine(lpImcP);
wCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
lpCandList->dwCount = 0;
for (i = 0; i < IME_UNICODE_MAXCAND; i++, wCode++) {
#ifdef UNICODE
// add this string into candidate list
*(LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount]) = wCode;
#else
WideCharToMultiByte(NATIVE_ANSI_CP, NULL, &wCode, 1, &xCode, 2, NULL, NULL);
// add this string into candidate list
*(LPUNAWORD)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount]) = xCode;
#endif
// null terminator
*(LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount] + sizeof(WORD)) = TEXT('\0');
lpCandList->dwOffset[lpCandList->dwCount + 1] =
lpCandList->dwOffset[lpCandList->dwCount] +
sizeof(WORD) + sizeof(TCHAR);
lpCandList->dwCount++;
}
return (ENGINE_COMP);
} else {
InitCompStr(lpCompStr);
// the result string = the selected candidate;
wCode = UnicodeEngine(lpImcP);
{
WCHAR UniStr[2];
UniStr[0] = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
UniStr[1] = 0;
lstrcpy((LPTSTR)((LPBYTE)lpCompStr + lpCompStr->dwResultStrOffset),UniStr);
// calculate result string length
lpCompStr->dwResultStrLen = lstrlen(UniStr);
}
return (ENGINE_RESAULT);
}
}
#else //COMBO_IME
#ifdef GB
{
// GB
DWORD i;
WORD wCode;
TCHAR ResaultStr[3];
if((lpImcP->bSeq[2] == TEXT('?'))) {
wCode = GBEngine(lpImcP);
wCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
for (i = 0; i < IME_MAXCAND; i++, wCode++) {
AddCodeIntoCand(lpCandList, wCode);
}
return (ENGINE_COMP);
} else if(wCharCode == TEXT(' ')) {
wCode = GBSpcEng(lpImcP);
lpImcP->bSeq[2] = 0;
lpImcP->bSeq[3] = 0;
wCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
for (i = 0; i < IME_MAXCAND; i++, wCode++) {
AddCodeIntoCand(lpCandList, wCode);
}
return (ENGINE_COMP);
} else {
InitCompStr(lpCompStr);
// the result string = the selected candidate;
wCode = GBEngine(lpImcP);
#ifdef UNICODE
// change CP_ACP to 936, so that it can work under Multilingul Env.
MultiByteToWideChar(NATIVE_ANSI_CP, NULL, &wCode, 2, ResaultStr, sizeof(ResaultStr)/sizeof(TCHAR));
ResaultStr[1] = TEXT('\0');
#else
ResaultStr[0] = LOBYTE(wCode);
ResaultStr[1] = HIBYTE(wCode);
ResaultStr[2] = 0x00;
#endif
lstrcpy((LPTSTR)lpCompStr + lpCompStr->dwResultStrOffset,ResaultStr);
// calculate result string length
lpCompStr->dwResultStrLen = lstrlen(ResaultStr);
return (ENGINE_RESAULT);
}
}
#else
{
// XGB
DWORD i;
WORD wCode;
TCHAR ResaultStr[3];
if((lpImcP->bSeq[2] == TEXT('?'))) {
wCode = XGBEngine(lpImcP);
wCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
for (i = 0; i < (0x7e-0x40+1); i++, wCode++) {
XGBAddCodeIntoCand(lpCandList, wCode);
}
wCode ++;
for (i = 0; i < (0xfe-0x80+1); i++, wCode++) {
XGBAddCodeIntoCand(lpCandList, wCode);
}
return (ENGINE_COMP);
} else if(wCharCode == TEXT(' ')) {
wCode = XGBSpcEng(lpImcP);
lpImcP->bSeq[2] = 0;
lpImcP->bSeq[3] = 0;
wCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
for (i = 0; i < (0x7e-0x40+1); i++, wCode++) {
XGBAddCodeIntoCand(lpCandList, wCode);
}
wCode ++;
for (i = 0; i < (0xfe-0x80+1); i++, wCode++) {
XGBAddCodeIntoCand(lpCandList, wCode);
}
return (ENGINE_COMP);
} else {
InitCompStr(lpCompStr);
// the result string = the selected candidate;
wCode = XGBEngine(lpImcP);
#ifdef UNICODE
// change CP_ACP to 936, so that it can work under Multilingul Env.
MultiByteToWideChar(NATIVE_ANSI_CP, NULL, &wCode, 2, ResaultStr, sizeof(ResaultStr)/sizeof(TCHAR));
ResaultStr[1] = TEXT('\0');
#else
ResaultStr[0] = LOBYTE(wCode);
ResaultStr[1] = HIBYTE(wCode);
ResaultStr[2] = 0x00;
#endif
lstrcpy((LPTSTR)lpCompStr + lpCompStr->dwResultStrOffset,ResaultStr);
// calculate result string length
lpCompStr->dwResultStrLen = lstrlen(ResaultStr);
return (ENGINE_RESAULT);
}
}
#endif //GB
#endif //COMBO_IME
}
MessageBeep((UINT)-1);
return (ENGINE_COMP);
}
/**********************************************************************/
/* AddCodeIntoCand() */
/**********************************************************************/
void PASCAL AddCodeIntoCand(
LPCANDIDATELIST lpCandList,
WORD wCode)
{
WORD wInCode;
if (lpCandList->dwCount >= IME_MAXCAND) {
return;
}
wInCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
#ifdef UNICODE
{
TCHAR wUnicode;
// change CP_ACP to 936, so that it can work under Multilingul Env.
MultiByteToWideChar(NATIVE_ANSI_CP, 0, (LPCSTR) &wInCode, 2, &wUnicode, 1);
*(LPUNAWORD)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount]) = wUnicode;
}
#else
// add GB string into candidate list
*(LPUNAWORD)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount]) = wInCode;
#endif
// null terminator
*(LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount] + sizeof(WORD)) = TEXT('\0');
lpCandList->dwOffset[lpCandList->dwCount + 1] =
lpCandList->dwOffset[lpCandList->dwCount] +
sizeof(WORD) + sizeof(TCHAR);
lpCandList->dwCount++;
return;
}
#if defined(COMBO_IME)
/**********************************************************************/
/* UnicodeAddCodeIntoCand() */
/**********************************************************************/
void PASCAL UnicodeAddCodeIntoCand(
LPCANDIDATELIST lpCandList,
WORD wCode)
{
if (lpCandList->dwCount >= IME_UNICODE_MAXCAND) {
return;
}
// add this string into candidate list
*(LPUNAWORD)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount]) = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
// null terminator
*(LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount] + sizeof(WORD)) = TEXT('\0');
lpCandList->dwOffset[lpCandList->dwCount + 1] =
lpCandList->dwOffset[lpCandList->dwCount] +
sizeof(WORD) + sizeof(TCHAR);
lpCandList->dwCount++;
return;
}
#endif //COMBO_IME
/**********************************************************************/
/* XGBAddCodeIntoCand() */
/**********************************************************************/
void PASCAL XGBAddCodeIntoCand(
LPCANDIDATELIST lpCandList,
WORD wCode)
{
WORD wInCode;
if (lpCandList->dwCount >= IME_XGB_MAXCAND) {
return;
}
wInCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
#ifdef UNICODE
{
TCHAR wUnicode;
// change CP_ACP to 936, so that it can work under Multilingul Env.
MultiByteToWideChar(NATIVE_ANSI_CP, 0, (LPCSTR) &wInCode, 2, &wUnicode, 1);
*(LPUNAWORD)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount]) = wUnicode;
}
#else
// add GB string into candidate list
*(LPUNAWORD)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount]) = wInCode;
#endif
*(LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[
lpCandList->dwCount] + sizeof(WORD)) = TEXT('\0');
lpCandList->dwOffset[lpCandList->dwCount + 1] =
lpCandList->dwOffset[lpCandList->dwCount] +
sizeof(WORD) + sizeof(TCHAR);
lpCandList->dwCount++;
return;
}
/**********************************************************************/
/* CompEscapeKey() */
/**********************************************************************/
void PASCAL CompEscapeKey(
LPINPUTCONTEXT lpIMC,
LPCOMPOSITIONSTRING lpCompStr,
LPGUIDELINE lpGuideLine,
LPPRIVCONTEXT lpImcP)
{
if (!lpGuideLine) {
MessageBeep((UINT)-1);
} else if (lpGuideLine->dwLevel != GL_LEVEL_NOGUIDELINE) {
lpGuideLine->dwLevel = GL_LEVEL_NOGUIDELINE;
lpGuideLine->dwIndex = GL_ID_UNKNOWN;
lpGuideLine->dwStrLen = 0;
lpImcP->fdwImeMsg |= MSG_GUIDELINE;
}
if (lpImcP->iImeState != CST_CHOOSE) {
if (lpImcP->fdwImeMsg & MSG_ALREADY_START) {
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_END_COMPOSITION) &
~(MSG_START_COMPOSITION);
}
}
lpImcP->iImeState = CST_INIT;
*(LPDWORD)lpImcP->bSeq = 0;
if (lpCompStr) {
InitCompStr(lpCompStr);
lpImcP->fdwImeMsg |= MSG_COMPOSITION;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -