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

📄 compose.c

📁 蒙古文输入法源码
💻 C
字号:
/*++

Copyright (c) 1990-1999 Microsoft Corporation, All Rights Reserved

Module Name:

   compose.c 

++*/


#include <windows.h>
#include <imm.h>
#include <imedefs.h>

void PASCAL XGBAddCodeIntoCand(LPCANDIDATELIST, WORD);
void PASCAL UnicodeAddCodeIntoCand(LPCANDIDATELIST, WORD);

/**********************************************************************/
/* UnicodeEngine()                                                         */
/* Description:                                                       */
/*      Conv GBcode                                                   */
/**********************************************************************/
WORD PASCAL UnicodeEngine(LPPRIVCONTEXT lpImcP)
{
     if (lpImcP->bSeq[3] || lpImcP->bSeq[2] == TEXT('?') || lpImcP->bSeq[2] == TEXT(' ')) 
	 { 
         if (lpImcP->bSeq[2] == TEXT('?') || lpImcP->bSeq[2] == TEXT(' '))
		 { 
                lpImcP->bSeq[2] = TEXT('0');
                lpImcP->bSeq[3] = TEXT('0');
         }
         return (AsciiToGB(lpImcP));
     } else {
         return (0);
     }
}

/**********************************************************************/
/* XGBEngine()                                                         */
/* Description:                                                       */
/*      Conv GBcode                                                   */
/**********************************************************************/
WORD PASCAL XGBEngine(LPPRIVCONTEXT lpImcP)
{
    WORD wCode;

     if (lpImcP->bSeq[3] ||(lpImcP->bSeq[2] == TEXT('?'))) { 
          if (lpImcP->bSeq[2] == TEXT('?')){  //add 626
                lpImcP->bSeq[2] = TEXT('4');
                lpImcP->bSeq[3] = TEXT('0');
          }
          wCode = AsciiToGB(lpImcP);
          return wCode;
     } else {
        return ((WORD)NULL);
     }
}

/**********************************************************************/
/* XGBSpcEng()                                                         */
/* Description:                                                       */
/*      Conv GBcode for Space                                         */
/**********************************************************************/
WORD PASCAL XGBSpcEng(LPPRIVCONTEXT lpImcP)
{
    WORD wCode;

    lpImcP->bSeq[2] = TEXT('4');
    lpImcP->bSeq[3] = TEXT('0');
    wCode = AsciiToGB(lpImcP);

    return wCode;
}

/**********************************************************************/
/* GBEngine()                                                         */
/* Description:                                                       */
/*      Conv GBcode                                                   */
/**********************************************************************/
WORD PASCAL GBEngine(LPPRIVCONTEXT lpImcP)
{
    WORD wCode;

     if (lpImcP->bSeq[3] ||(lpImcP->bSeq[2] == TEXT('?'))) { 

        if (lpImcP->bSeq[0] >=TEXT('0') && lpImcP->bSeq[0] <=TEXT('9')) { //Area mode
             if (lpImcP->bSeq[2] == TEXT('?')){

                  lpImcP->bSeq[2] = TEXT('0');
                  lpImcP->bSeq[3] = TEXT('1');
             }
             return (AsciiToArea(lpImcP));
        }
        else if (lpImcP->bSeq[0] >=TEXT('a') && lpImcP->bSeq[0] <=TEXT('f')) { //GB mode

                 if (lpImcP->bSeq[2] == TEXT('?')){
                     lpImcP->bSeq[2] = TEXT('a');
                     lpImcP->bSeq[3] = TEXT('1');
                 }
                 wCode = AsciiToGB(lpImcP);
                 return wCode;
             } else {
                 return ((WORD)NULL);
             }
     } else 
         return ((WORD)NULL);
     
}

/**********************************************************************/
/* GBSpcEng()                                                         */
/* Description:                                                       */
/*      Conv GBcode for Space                                         */
/**********************************************************************/
WORD PASCAL GBSpcEng(LPPRIVCONTEXT lpImcP)
{
        if (lpImcP->bSeq[0] >=TEXT('0') && lpImcP->bSeq[0] <=TEXT('9')) { //Area mode
            lpImcP->bSeq[2] = TEXT('0');
            lpImcP->bSeq[3] = TEXT('1');
            return (AsciiToArea(lpImcP));
        } else if (lpImcP->bSeq[0] >=TEXT('a') && lpImcP->bSeq[0] <=TEXT('f')) { //GB mode
            lpImcP->bSeq[2] = TEXT('a');
            lpImcP->bSeq[3] = TEXT('1');
            return (AsciiToGB(lpImcP));
        } else {
            return ((WORD)NULL);
        }
}

/**********************************************************************/
/* AsciiToGB                                                          */
/* Description:                                                       */
/**********************************************************************/
WORD PASCAL AsciiToGB(LPPRIVCONTEXT lpImcP)
{
    WORD GBCode;

    GBCode = (CharToHex(lpImcP->bSeq[2]) << 4) + CharToHex(lpImcP->bSeq[3]);
    GBCode = GBCode * 256;
    GBCode = (CharToHex(lpImcP->bSeq[0]) << 4) + CharToHex(lpImcP->bSeq[1]) + GBCode;

    return (GBCode);
}

/**********************************************************************/
/* AsciiToArea                                                        */
/* Description:                                                       */
/**********************************************************************/
WORD PASCAL AsciiToArea(LPPRIVCONTEXT lpImcP)
{
WORD AreaCode;
    AreaCode = (CharToHex(lpImcP->bSeq[2]) * 10) + CharToHex(lpImcP->bSeq[3]) + 0xa0;
    AreaCode = AreaCode * 256;
    AreaCode = (CharToHex(lpImcP->bSeq[0]) * 10) + CharToHex(lpImcP->bSeq[1]) + AreaCode + 0xa0;
        return (AreaCode);
}

WORD PASCAL CharToHex(
    TCHAR cChar)
{
    if (cChar >= TEXT('0') && cChar <= TEXT('9'))
        return((WORD)(cChar - TEXT('0')));
    else if (cChar >= TEXT('a') && cChar <= TEXT('f'))
        return((WORD)(cChar-TEXT('a')+ 0x0a));
    else
        return ((WORD)NULL);
}



/**********************************************************************/
/* Engine()                                                           */
/* Description:                                                       */
/*      search MB and fill lpCompStr and lpCandList                   */
/**********************************************************************/
int PASCAL Engine(
    LPCOMPOSITIONSTRING lpCompStr,
    LPCANDIDATELIST     lpCandList,
    LPPRIVCONTEXT       lpImcP,
    LPINPUTCONTEXT      lpIMC,
    WORD                wCharCode)
{
    //if(lpCompStr->dwCursorPos < 4
    //  && (lpImcP->bSeq[2] != TEXT('?'))
    //  && (wCharCode != TEXT(' '))) {
    //    return (ENGINE_COMP);
    //}

    //if( (wCharCode != TEXT(' ')) ) 
	//{	////继续输入
        //return (ENGINE_COMP);
    //}	
	//else if( /*(lpCompStr->dwCursorPos==4)  ////大于等于4个字母的时候不让输入了。
    //         ||(lpImcP->bSeq[2] == TEXT('?'))
    //         ||*/((wCharCode == TEXT(' ')) /* && (lpCompStr->dwCursorPos == 2) */)) 
	{ ///该显示列表了
		
        if (!lpCompStr) 
		{
            MessageBeep((UINT)-1);
//			__asm int 3;
            return -1;
        }

        if (!lpImcP) 
		{
            MessageBeep((UINT)-1);
//			__asm int 3;
            return -1;
        }

        {
            DWORD i, j;
            WORD wCode;
            TCHAR ResaultStr[7];

			//__asm int 3;
			if(wCharCode != TEXT(' ')) ////不是空格显示列表
			{
				TCHAR szMong[10];
                //wCode = GBSpcEng(lpImcP);
                //lpImcP->bSeq[2] = 0;
                //lpImcP->bSeq[3] = 0;
                //wCode = HIBYTE(wCode) | (LOBYTE(wCode) << 8);
				///////在这里把 lpImcP->bSeq 中输入的ascii码,转换成蒙文文字
				///////添加到 AddCodeIntoCand(lpCandList, 转换后的蒙文 );
				///////需要修改 AddCodeIntoCand的第二个参数为字符串
				ZeroMemory( szMong, 10*sizeof(TCHAR) );
				wCode = (WORD)0x1820;
				//__asm int 3;
                for (i = 0, j = 0 ; i < IME_MAXCAND ; i+=lstrlen(szMong), j++ ) {
					wsprintf( szMong, TEXT("

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -