• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Windows中文輸入法的實現

    發表于:2007-07-01來源:作者:點擊數: 標簽:
    Windows 中文輸入法的實現 本人設計了一個“3++輸入法”,可運行操作系統 Windows95/98/NT/2000,“3++輸入法”為純形碼,無需識別碼,易學,易用,錄入速度快,含“簡體、繁體、專業”三種版本,字根量小,詞組數大于26000個,全部重碼數僅為73個,您可以在

                                 Windows 中文輸入法的實現   

          本人設計了一個“3++輸入法”,可運行操作系統 Windows95/98/NT/2000,“3++輸入法”為純形碼,無需識別碼,易學,易用,錄入速度快,含“簡體、繁體、專業”三種版本,字根量小,詞組數大于26000個,全部重碼數僅為73個,您可以在  下搜索“3++輸入法”下載軟件,或在:  下載。歡迎各位試用并提出寶貴意見。如有問題可發Email: 給我。
           限于篇幅,Windows系統下漢字輸入法的基本原理,大家可參考 MSDN 中的有關文檔。本人僅對程序設計的實現方法說明如下:
          一、在 Windows 任務欄中增加輸入法名稱
           這也就是 Setup 程序的關鍵,實際上,可以利用 ImmInstallIME 函數。該函數的原形是:HKL ImmInstallIME( LPCTSTR lpszIMEFileName, LPCTSTR lpszLayoutText);前一個參數 lpszIMEFileName 是“.ime”文件的路徑,Win9x 為“\System”下,WinNT/2000為“\System32”下。后一個參數 lpszLayoutText  是輸入法的明稱。如 HKL MyIme=ImmInstallIME("Windows\\system\\3jaja.ime","3++輸入法"); 如果 MyIme 不返回 NULL ,則調用成功。
          當然你必須先設計好 DLL 程序“.ime”文件和碼表原文件“.mb”文件。

    二、“.ime”文件的實現
         程序中的輸出函數(必須)即文件“.def”中的函數,以下為函數的名稱和原形,部分函數給出了原函數,希望對你能有所幫助。

    //初始化輸入法函數
    BOOL WINAPI ImeInquire(LPIMEINFO lpImeInfo,LPTSTR lpszWndCls,DWORD lpszOptions)
    {
       if (!lpImeInfo)
          return (FALSE);
       lpImeInfo->dwPrivateDataSize = sizeof(PRIVCONTEXT);
       lpImeInfo->fdwProperty = IME_PROP_KBD_CHAR_FIRST|
                                 IME_PROP_CANDLIST_START_FROM_1|
                                 IME_PROP_IGNORE_UPKEYS;
       lpImeInfo->fdwConversionCaps =      IME_CMODE_NATIVE|IME_CMODE_NATIVE|IME_CMODE_FULLSHAPE|IME_CMODE_CHARCODE|IME_CMODE_SOFTKBD|IME_CMODE_NOCONVERSION;
      lpImeInfo->fdwSentenceCaps = 0;
      lpImeInfo->fdwUICaps = UI_CAP_ROT90|UI_CAP_SOFTKBD;
      lpImeInfo->fdwSCSCaps = SCS_CAP_COMPSTR|SCS_CAP_MAKEREAD;
      lpImeInfo->fdwSelectCaps = (DWORD)0;
      lstrcpy(lpszWndCls, (LPTSTR)szUIClassName);
      return (TRUE);
    }      
                   
    //自定義漢字編碼格式,未作處理。
    DWORD WINAPI ImeConversionList(HIMC hIMC,LPCTSTR lpszSrc,DWORD uBufLen,UINT uFlag)
    {
         return (0);
    }

    //設置輸入法狀態函數,如光標跟隨等
    BOOL WINAPI ImeConfigure(HKL hKL,HWND hAppWnd,DWORD dwMode,LPVOID  lpData)
    {
        switch (dwMode)
       {
           case IME_CONFIG_GENERAL:
                 DialogBox(hInst, MAKEINTRESOURCE(SETIME), (HWND)hAppWnd, (DLGPROC)ImeSetDlgProc);
                break;
           default:
               return (FALSE);
              break;
          }
         return (TRUE);
    }

    //退出
    BOOL WINAPI ImeDestroy(UINT uReserved)
    {
         if (uReserved)
            return (FALSE);
         return (TRUE);

                 
    //應用接口函數
    LRESULT WINAPI ImeEscape(HIMC hIMC,UINT uSubFunc,LPVOID lpData)
    {
         LRESULT lRet;

         switch (uSubFunc)
       {
           case IME_ESC_QUERY_SUPPORT:
              if ( lpData == NULL )
       return FALSE;

        switch (*(LPUINT)lpData)
      {
        case IME_ESC_QUERY_SUPPORT:
        case IME_ESC_MAX_KEY:
        case IME_ESC_IME_NAME:
        case IME_ESC_GETHELPFILENAME:
               return (TRUE);
        case IME_ESC_SEQUENCE_TO_INTERNAL:
        case IME_ESC_GET_EUDC_DICTIONARY:
        case IME_ESC_SET_EUDC_DICTIONARY:
        case IME_INPUTKEYTOSEQUENCE:
             return (FALSE);         
        default:
            return (FALSE);
        }
       break;
       case IME_ESC_SEQUENCE_TO_INTERNAL:
       case IME_ESC_GET_EUDC_DICTIONARY:
       case IME_ESC_SET_EUDC_DICTIONARY:
       case IME_INPUTKEYTOSEQUENCE:
            return (FALSE);
       case IME_ESC_MAX_KEY:
            return ((WORD) 4);
      case IME_ESC_GETHELPFILENAME:
      {
          TCHAR szIMEGUDHlpName[MAXSTRLEN];
          if (lpData == NULL )
                return FALSE;

          szIMEGUDHlpName[0] = 0;
          GetWindowsDirectory((LPTSTR)szIMEGUDHlpName, MAXSTRLEN);
          lstrcat((LPTSTR)szIMEGUDHlpName, TEXT(""));
          lstrcpy((char*)lpData, (char*)szIMEGUDHlpName);
          return TRUE;
        }

        default:
            return (FALSE);
        }

        return (lRet);

      
    //啟動輸入法設置功能
    BOOL WINAPI ImeSelect(HIMC hIMC,BOOL fSelect)
    {
         LPINPUTCONTEXT lpIMC;
         BOOL           fRet;

        if (!hIMC)
           return (FALSE);

        lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
        if (!lpIMC)
          return (FALSE);

        fRet = Select(hIMC, lpIMC, fSelect);
        ImmUnlockIMC(hIMC);
        return (fRet);

    //設置輸入活動狀態
    BOOL WINAPI ImeSetActiveContext(HIMC hIMC,BOOL fOn)
    {
         if (fOn&&hIMC)
        {
              LPINPUTCONTEXT lpIMC;

             lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
             if (!lpIMC)
                 return (FALSE);

            InitContext(lpIMC);
            ImmUnlockIMC(hIMC);
         }
         return (TRUE);
     }

    //用戶按鍵處理函數,例如中英文狀態,返回 FALSE 為英文狀態,按鍵不作處理。
    BOOL WINAPI ImeProcessKey(HIMC hIMC,UINT uVirtKey,LPARAM lParam,CONST LPBYTE lpbKeyState);
                   
    //輸入法編碼字符處理。
    BOOL WINAPI ImeSetCompositionString(HIMC hIMC,DWORD dwIndex,LPVOID lpComp,
        DWORD  dwCompLen,LPVOID lpRead,DWORD  dwReadLen);

    //將用戶按鍵轉換為漢字編碼
    UINT WINAPI ImeToAsciiEx(UINT uVirtKey,UINT uScanCode,CONST LPBYTE lpbKeyState,LPTRANSMSGLIST lpTransBuf,UINT fuState,HIMC hIMC)           
                   
    //處理IME消息函數
    BOOL WINAPI NotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue);     

    //自定義漢字編碼格式,未作處理。
    BOOL WINAPI ImeRegisterWord(LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString)
    {
        return (FALSE);
    }

    //自定義漢字編碼格式,未作處理。
    BOOL WINAPI ImeUnregisterWord(LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString)
    {
        return (FALSE);
    }

    //自定義漢字編碼格式,未作處理。
    UINT WINAPI ImeGetRegisterWordStyle(UINT nItem,LPSTYLEBUF lpStyleBuf)
    {
        return (FALSE);
    }

    //自定義漢字編碼格式,未作處理。
    UINT WINAPI ImeEnumRegisterWord(REGISTERWORDENUMPROC lpfnRegisterWordEnumProc,
        LPCTSTR lpszReading,DWORD dwStyle,LPCTSTR lpszString,LPVOID lpData)
    {
        return (FALSE);
    }

    //UI窗口過程
    LRESULT CALLBACK UIWndProc(HWND   hUIWnd,UINT   uMsg,WPARAM wParam,LPARAM lParam)
    {
     switch (uMsg)
     {
      case WM_CREATE:
          CreateUIWindow(hUIWnd);
           break;
      case WM_DESTROY:
          DestroyUIWindow(hUIWnd);
          break;
      case WM_IME_STARTCOMPOSITION:
      ……
    }

    //狀態窗口過程
    LRESULT CALLBACK StatusWndProc(HWND hStatusWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

    //編碼窗口過程
    LRESULT CALLBACK CompWndProc(HWND hCompWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

    //侯選漢字窗口過程
    LRESULT CALLBACK CandWndProc(HWND hCandWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

    三、頭文件及鏈接文件
        記得要定義 IMM32.h 及鏈接文件 IMM32.lib。至于有關“ .ime”程序中必須用到的結構,大家可參考 MSDN 中的有關文檔。


    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>