日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Wince输入法换肤换语言机制

發布時間:2025/4/16 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Wince输入法换肤换语言机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需求描述:
最近由于邦健客戶提出新需求:需要在一個系統內同時實現中英文兩個語種的輸入法。
即,客戶的wince系統語言版本是中文,但在其中的應用軟件有中文和英文兩個版本,所以相應的輸入法也需要做調整,做到:應用程序是中文時,出現的是中文界面的輸入法;應用程序是英文時,出現的是英文界面的輸入法。

相關決策:
由于該需求有助于強化wince輸入法的功能,且對后續的維護工作有改進效果,所以承接該需求。

已有資源:
鑒于之前國筆wince輸入法的版本已有中文版和英文版,目前要做的就是整合中英文版的代碼,兼容中、英版本的皮膚文件,并提供接口供客戶隨時調用,實現切換皮膚和引擎開關的即時切換。

設計因素:
1, 版本兼容性:包括對系統語言版本的兼容
2, 客戶調用接口的便利性:提供通用、靈活的方法來實現客戶需要的接口,并且便于測試
3, 穩定性:對原有代碼盡可能地減少改動,并最大限度利用現有資源(函數、皮膚文件等)

設計步驟:
1, 考慮到接口的便利性,決定采用發送自定義消息的方式提供語言切換的接口。
2, 第一階段,整合中英文版本。原有的中文版和英文版的區別,在于一些宏定義。當初也是為了便于管理,把英文版作為中文版的分支獨立出來,為版本管理降低了一些反復的宏定義開關修改過程。整合的過程并不復雜,只需要小心地把兩個版本不一樣的地方分別用宏定義控制即可。
3, 但是單靠語言控制宏不能實現動態的語言版本切換,需要將宏定義改成可以隨時更改的變量,所以第二步就是用變量wSystemLangIDPrimary代替宏定義,由變量來決定當前的語言版本,以便修改引擎設置。
4, 變量的賦值有兩個途徑:
a) 第一個途徑是初始化賦值,獲取系統語言版本ID,04代表中文,09代表英文。(參考資料:
http://tech.cuit.edu.cn/forum/thread-505-1-6.html

WORD wSystemLangID = GetSystemDefaultLangID();
WORD wSystemLangIDPrimary = PRIMARYLANGID( wSystemLangID );

b) 第二個途徑是通過應用程序發送消息更改變量wSystemLangIDPrimary。消息定義如下:
// 應用程序用GB_CHANGE_IM_TYPE消息通知軟鍵盤切換輸入法類型[2010.7.22 lishuzhe]
// wparam == GB_SWITCH_IM_TYPE時,lparam的值意義如下:,拼音;2,筆畫;3,英文;4,數字;5,字母;6,手寫;
// wparam == GB_MOVE_SIP時,lparam = MAKELPARAM(x,y);
// wparam == GB_APP_LANG時,lparam = LANG_CHINESE(0x04)時,代表中文界面;lparam = LANG_ENGLISH(0x09)時,代表英文界面。

#define GB_APP_MSG 0x00CC00CC
enum GB_APP_CONTROL_TYPE{
GB_APP_SWITCH_IM_TYPE = 0,
GB_APP_MOVE_SIP = 1,
GB_APP_LANG = 2
};
當客戶想輸入法窗口發送消息,
PostMessage( hwnd , GB_APP_MSG , GB_APP_LANG , nLang );
輸入法響應消息,修改wSystemLangIDPrimary,隱藏界面,在注冊表將isSkinChange一項設置為1,表示下次顯示窗口時應該重新讀取皮膚文件。
用戶再次調出輸入法面板時,將讀取注冊表項isSkinChange,如果為1,則引擎將根據wSystemLangIDPrimary重新初始化,并重新加載皮膚。

5, 如何根據系統語言ID號來選擇相應的皮膚:
a) 每套皮膚包括一個png文件和一個gbk文件,其前綴相同,僅后綴不同。其中png文件是帶有多層圖像數據的圖片文件,gbk是含有對應png割圖信息的數據文件。用戶如果需要全英文界面,則皮膚文件將不會出現中文字符,如果還需要與中文版切換,就需要兩套皮膚。因為我們的皮膚文件格式尚未做到可以切換中英文的功能,所以只能將兩套皮膚都放在安裝目錄下,由輸入法模塊來根據變量wSystemLangIDPrimary來選擇。
b) 皮膚的屬性包括:顏色、橫\豎屏、大小、語言。
i. 大小:現有代碼對皮膚大小和橫\豎屏的處理都比較完善和智能化處理。初始化模塊會加載皮膚文件,讀取數據頭,獲取該套皮膚的寬、高,以及橫豎屏。比如屏幕是240X320的,就將安裝目錄下的所有該分辨率的皮膚加入列表(即為SkinList,包括了皮膚文件的文件名、皮膚大小等)以供選擇(獲取屏幕信息的函數GetSystemMetrics和SystemParametersInfo)。如果沒有完全匹配的皮膚,則選擇面積最相近的那一套。
ii. 橫\豎屏:同理,橫\豎屏也可以通過讀取皮膚信息和屏幕屬性對比來確定。皮膚文件已經包含了自動變換橫豎屏的信息,所以不需要針對橫豎屏作額外處理(本處內容與皮膚文件格式與解析有關,暫不贅述)。
iii. 顏色:注冊表項SkinColor的值是顏色的名稱,比如blue、black、red等,不區分大小寫。
iv. 語言:注冊表項Language的值是語言的名稱,比如English、Chinese等,不區分大小寫。
v. 系統啟動時,讀取注冊表項SkinColor和Language,拼接皮膚文件前綴,其格式為:SkinColor_Language_Size,如果SkinColor和Language的值分別是Blue和English,則皮膚文件前綴應該是Blue_English_XXX,其中XXX是大小,一般為wvga、vga、qvga等。拼接好文件前綴后,就在已經讀取的適用列表SkinList中進行匹配,找到相應的皮膚文件全名,加載之。
c) 示例:
i. 啟動時,輸入法模塊先獲取系統語言ID號,如果wSystemLangIDPrimary是04,則將注冊表項Language設置為Chinese。
ii. 然后讀取SkinColor和Language,獲得最匹配的皮膚文件,根據wSystemLangIDPrimary初始化引擎為中文模式。
iii. 如果用戶想切換至純英文界面,則發送消息
PostMessage( hwnd , GB_APP_MSG , GB_APP_LANG , 09 );
即可。
iv. 輸入法收到消息后,更改Language的值為English,設置isSkinChange為1,并隱藏輸入法界面。待下一次調出虛擬鍵盤時,將重新初始化引擎為英文模式,并加載英文皮膚,設置isSkinChange為0。這樣就完成了語言和皮膚的切換。
v. 后續如果有用戶需要輸入法提供換膚功能,則可以發送消息通知輸入法修改SkinColor表項值(Language值不變),并設置isSkinChange為1,這樣在下一次顯示界面時,就可以切換到相應的皮膚上了。

總結

以上是生活随笔為你收集整理的Wince输入法换肤换语言机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。