1. 程式人生 > >微軟輸入法TSF SampleIME 代碼淺說

微軟輸入法TSF SampleIME 代碼淺說

框架 ble 列表 ngs 一個 getc col 是否 模式

原文:微軟輸入法TSF SampleIME 代碼淺說

微軟提供了一個簡單的TSF拼音輸入法的示例SampleIME,主要的問題是:不支持數字鍵選候選字,不能自動上屏,沒有聯想功能。在筆者開發動態輸入法Windows版時,以其為藍本,主要針對上面幾個問題進行了改造:支持數字鍵選,支持自動上屏,支持聯想。下面從應用的角度對SmapleIME源代碼進行解說,看看從按鍵到漢字上屏這個過程都發生了什麽。

SampleIME 的源代碼結構

SampleIME 的源代碼有四五十個cpp文件,這些文件可以說是支離破碎,不清楚原作者為什麽要這麽做,非常懷疑是故意的。其中比較重要的有這麽幾個類:CCandidateWindow,候選字窗口;CCompositionPricessorEngine,拼寫引擎;CSampleIME,主程序。另外,SampleIME還定義了一種特殊的字符串類:CStringRange,見於 SampleIMEBaseStructure.h。其他有用的類的會陸續說到。

CSampleIME 中定義了拼寫引擎_pCompositionProcessorEngine ?和候選字列表提供者 _pCandidateListUIPresenter,後者包含一個候選字窗口。

  • CSampleIME:
    • CCompositionProcessorEngine* _pCompositionProcessorEngine;
    • CCandidateListUIPresenter *_pCandidateListUIPresenter;
      • CCandidateWindow *_pCandidateWnd;

以上就構成了輸入法的主體框架。

?

輸入過程概覽

輸入過程,就是從用戶敲擊按鍵到文字上屏(到達預定的編輯區域)的全過程,應該說,對於 Windows 系統來說,這個過程極其地繁瑣。

首先,在中文模式下,不是所有按鍵都會送給輸入法處理,這裏定義了所有支持的按鍵:CCompositionProcessorEngine::InitKeyStrokeTable()。註意,其中的鍵值,並非按鍵符號的ASCII碼,而是鍵盤按鍵的 keycode,只不過恰好26字母的keycode==ASCII,具體請百度。

然後,當用戶按下了一個按鍵,首先會被傳遞到這裏:CSampleIME::OnTestKeyDown(),為什麽是Test呢?就是測試以下這個按鍵是否需要處理。如果需要處理,就傳遞給

CSampleIME::OnKeyDown(),也就是交給輸入法處理了。當用戶松開這個按鍵的時候,也相應地依次傳遞給 CSampleIME::OnTestKeyUp() CSampleIME::OnKeyUp()

接下來,被支持的按鍵,如果不是刪除鍵,就被傳遞到這裏:CSampleIME::_HandleCompositionInput();如果是刪除鍵,則傳遞到:CSampleIME::_HandleCompositionBackspace();這兩個分支裏面各自經歷了一系列過程,但最終都是調用CCompositionProcessorEngine::GetReadingStrings()產生了一個拼寫文本,然後再調用CCompositionProcessorEngine::GetCandidateList()獲得一個候選字列表。什麽是拼寫文本呢?就是輸入的時候帶有下劃線的那部分還沒有確認上屏的文本。

至此,輸入法的基本面貌已經有了,但是還差一步,就是確認拼寫文本,把候選字上屏。一般這是由空格或者回車來實現的。但是這個最後一步,也是極其的繁瑣,最終在CSampleIME::_TerminateComposition() 結束這個拼寫過程。

微軟輸入法TSF SampleIME 代碼淺說