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

📄 compose.c

📁 This folder includes IME sample source code for Simplified Chinese IMEs
💻 C
📖 第 1 页 / 共 3 页
字号:
            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 + -