Windows CE下中文輸入法

來源:互聯網
上載者:User

CE包含了一種簡體中文輸入法,如果不想編寫自己的輸入法,那麼可以直接調用預設的。在講解中文輸入法之前順便提一下國際化(Internationalization),中文IME及輸入法只是國際化組件的一小部分。國際化是編寫面向不同語言使用者的軟體過程中一個重要環節,CE的國際化組件包含很多小的組件 。

下表描述了組件的名稱、功能:

名稱 功能
Agfa字型壓縮 支援字型壓縮
字型版本 因為東亞字型佔據記憶體較大,此組件提供了用於選擇不同大小字型檔的選項
手寫辨識 手寫辨識引擎
多語系使用者介面 提供給終端使用者用於切換語言種類
National Language System 國家語言支援(包括日期、時間、數字、貨幣格式)
Transcriber應用程式 識別英語、法語、德語的手寫辨識程式
Unicode碼支援 能夠處理和顯示Unicode碼
日語IME 日語輸入法
韓語IME 韓語輸入法
簡體中文IME 簡體中文輸入法
Shuang Pin IM 簡體中文雙拼IME
GB18030 轉換器 在GB18030到CE編碼之間的轉換
繁體中文IME 繁體中文輸入法

在定製核心的時候常會遇到這些組件,尤其是字型版本,選擇不同的字型對於整個核心的大小影響很大。在定製核心的時候,選擇PB提供的字型版本應該參照標題為"Font Versions"的協助文檔,在這個文檔中詳細的列舉了東亞語言字型的檔案名稱、內容、正常大小和壓縮大小。除了選擇合適的字型版本外,還應該採用Agfa字型壓縮技術,Agfa字型壓縮技術的優點是能夠減小字型佔用的ROM和RAM空間,另外能夠保證在壓縮和解壓縮後資料不丟失。如果採用字型壓縮,Agfa壓縮技術將字型壓縮成TrueType格式,並另存新檔副檔名為".ac3"的檔案,那麼CE在使用字型的時候首先尋找副檔名為".ac3"的檔案。如果不採用字型壓縮,CE將使用非壓縮字型,如副檔名為".ttf"".ttc"的檔案。下面講述關於簡體中文輸入法的相關知識。

CE的IME系統由下列幾個部分組成:

IME(輸入法)核心。包括和使用者輸入的語言相關的內容,比如IME、文字型檔等

IME介面。包括狀態視窗、寫作視窗、候選視窗、指南視窗

IMM(IME管理器)。負責在CE系統、應用程式、IME之間通訊

輸入上下文。包括使用者輸入狀態等

IME控制視窗。負責發送未處理的IME訊息到IME

IME系統的工作機制如下:

當IME系統啟動後,使用者按鍵盤,鍵盤訊息被IMM發送到IME。IME處理訊息內容,根據鍵盤訊息的內容或者產生用於寫作的字元,或者產生命令。當IME處理鍵盤訊息後,它發送通知訊息到當前獲得焦點的視窗,如果這個視窗不能處理IME通知訊息,那麼通知訊息被發送到IME控制視窗,控制視窗將訊息返回到IME,IME做預設的處理工作(IME提供了完整的使用者介面)。對於能夠處理IME通知訊息的視窗,被稱之為IME-aware視窗,相反不能處理IME通知訊息的視窗,被成為IME-unaware視窗。能夠處理IME通知訊息的視窗通過IMM 函數能夠實現自訂的輸入法。

輸入上下文:

輸入上下文儲存了IME的狀態資訊,它是IME的內部結構。對於每一個線程,系統建立和分配了一個預設的輸入上下文,線上程內的每個視窗都共用輸入內容相關的內容。具體輸入內容相關的結構體定義包含在標題為"INPUTCONTEXT"的協助文檔中。從文檔中看出,輸入上下文包含對應視窗控制代碼、寫作視窗和候選視窗和狀態視窗的位置、字型、訊息緩衝區等等。用函數ImmGetContext可以得到指定視窗對應的輸入內容相關的控制代碼。用ImmReleaseContext釋放指定的輸入上下文。如果不希望一個線程內的視窗都共用同一個輸入上下文,那麼可以調用函數ImmCreateContext來建立一個新的上下文,並調用函數ImmAssociateContext將新建立的輸入上下文與指定的視窗關聯。當不用這個新建立的上下文時,調用ImmDestroyContext來釋放記憶體。調用函數ImmLockIMC能夠得到一個指定的輸入內容相關的指標,通過這個指標可以訪問輸入內容相關的資料。訪問結束後調用函數ImmUnlockIMC,ImmUnlockIMC減少計算鎖數量,直到釋放控制代碼。關於輸入內容相關的例子代碼如下:

HIMC hIMC = ImmCreateContext();  ///建立新的上下文
LPINPUTCONTEXT lpIC;
lpIC = ImmLockIMC(hIMC);
....................       ///使用lpIC訪問上下文資料
ImmUnlockIMC(lpIC);
ImmAssociateContext(hWnd, hIMC);  ///與視窗關聯
ImmDestroyContext(hIMC);     ///最後釋放上下文

下面是調用中文IME的例子代碼:

HIMC hIMC = ImmGetContext(hWnd);  ///hWnd為當前視窗控制代碼
POINT pt;
pt.x = 300;
pt.y = 200;
ImmSetStatusWindowPos(hIMC, &pt);   ///設定狀態視窗位置
ImmSetOpenStatus(hIMC, TRUE);    ///開啟中文IME
ImmReleaseContext(hEdit, hIMC);     ///最後釋放上下文

我在開發過程中發現並非所有Imm函數都有效,通過對Pocket IME源碼分析後證實了我的發現。但上述的函數都能夠實現功能,對於只要能夠開啟並使用中文IME的要求還是可以滿足的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.