您的位置:首页 > 产品设计 > UI/UE

Windows CE下MUI image的实现

2008-04-29 19:01 148 查看
本文主要阐述如何实现CE image的在多种语言之间的自由切换,这里我们假设我们的image需要在两种语言(简体中文和韩文)之间切换,并且已经有了一个支持一种语言的image。(本文中所介绍的设定以CE6.0为标准)

微软在CE的帮助文档中已经有一个主题介绍如何生成一个MUI的image,how to create a multilingual run-time image using MUI,这里主要调用createmui.bat来生成MUI image所需要的资源文件并把它们拷贝到release目录下,同时生成一个mutiui.bib的文件,按照帮助文档中的介绍我们需要手动的把mutiui.bib文件中的内容拷贝到common.bib中,其实我们可以利用fmerge.exe在批处理中自动的实现。
Createmui 0804 0412

在作这些操作之前我们还需要把另一种语言所需要的Fonts,Input Method Editor, Input Method 和 Keyborad加到我们的工程当中,它们位于Core OS-->CEBASE-->International-->Local Specific Support, 同时在Porject-->Properties-->Local-->Locals中勾上相应的语言支持,在做完这些之后,我们生成的image已经包含了对两种语言的支持,但是还不能实现两种语言的切换。这时启动CE系统打开控制面板中区域设置,点击用户界面语言在下拉框中应该能看到我们希望支持的两种语言,如果选择切换到另外一种语言,重新启动之后可能会有一些异常的现象,比如字体不能正常显示等等。下面我们来分析产生这些现象的原因。

产生这些现象的原因,其实就是相应的注册表项并没有及时地切换,比如区域,codepage,字体,输入法等,下面我就把具体需要更改的地方列出来(以韩文为例)。也许有人会问怎么得到这些具体的这册表项的,一个比较笨但也是比较可靠的办法就生成一个这样语言版本的image,从中把这些注册表项提取出来。当然所有这些还有一个前提条件就是image必须能够保存系统设置。
;; ###### User Locale ######
[HKEY_LOCAL_MACHINE/NLS]
"DefaultLCID"=dword:0412
; Add an extra locale-specific currency symbol (e.g. Euro)
[HKEY_LOCAL_MACHINE/nls]
"ExtraCurrency"=dword:20ac
;; ###### MUI setting ######
; MUI Register setttins :
; HKLM/MUI/Enable - enable MUI or not
; HKLM/MUI/SysLang - system default langid
; HKCU/MUI/CurLang - langid for current user
[HKEY_LOCAL_MACHINE/MUI]
; Update the enable field to enable MUI
; IF SYSGEN_MULTIUI
"Enable"=dword:1
[HKEY_LOCAL_MACHINE/MUI]
; Update the enable field to enable MUI
; Update the SysLang field to set system default langid
"SysLang"=dword:412
[HKEY_CURRENT_USER/MUI]
; Update the CurLang field to set user default langid
"CurLang"=dword:412
;; ###### Code Page and selection ######
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/International]
"LCID"=dword:412
"ACP"=dword:3b5
[HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/International]
"Default_CodePage"=hex:b5,03,00,00
"AcceptLanguage"="ko,en-us;q=0.5"
;; ###### Font ######
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/FontLink/SystemLink]
"Tahoma"="//Windows//gulim.ac3,굴림"
"Arial"="//Windows//gulim.ac3,굴림"
"Courier New"="//Windows//gulim.ac3,굴림"
"Times New Roman"="//Windows//gulim.ac3,굴림"
"Symbol"="//Windows//gulim.ac3,굴림"
[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/FontLink/SkipTable]
"Tahoma"="005c"
;; ###### Keyboard and IME ######
[HKEY_CURRENT_USER/Keyboard Layout/Preload]
@="e0010412"
[HKEY_CURRENT_USER/Keyboard Layout/Preload/1]
@="e0010412"

在把这些注册表项倒入系统,就基本上完成了语言的切换,至于导入的方法,如果CE image中已经有一个类似于windows下的regedit.exe的工具当然是最方便的,如果没有就需要写程序调用系统API来完成这些工作了。

依照上面的方法完成语言切换不免有些麻烦,其实在调用控制面板中的区域设置时,我们就可以直接把这些注册表项导入系统中,需要做的只是稍微改动一下系统的source code, 这段源代码位于 (winceroot)/PUBLIC/WCESHELLFE/OAK/CTLPNL/INTL2, 打开combo.c,找到SaveCombo函数中的CBIS_MUI,可以根据不同的区域改变不同的注册表设置, 最后生成的intll.cpl就是我们定制之后的应用程序。这样就能够比较方便的实现语言切换。


case CBIS_MUI:


// Save UI language selection


if (pfnSetUserDefUILang && gfMUIChanged && giCurIndex != iOrigIndex)




...{


LIDTmp = (LANGID)ComboBox_GetItemData(hwnd, ComboBox_GetCurSel(hwnd));




if (!pfnSetUserDefUILang(LIDTmp))




...{


ASSERT(FALSE); //SetUserDefaultUILanguage failed


}


//Add to change necessary registry


switch(LIDTmp)




...{




case 0x0412:


lstrcpy( szBuf, _T("/s /windows/kr.reg") );


break;


case 0x804:


lstrcpy( szBuf, _T("/s /windows/sc.reg") );


break;


default:


}


CreateProcess( _T("regedit.exe"), szBuf, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL );




LOADSTRING(IDS_UICHANGETITLE, szUITitle);


LOADSTRING(IDS_UICHANGETEXT, szUIMessage);


MessageBox(ghwndMain, szUIMessage, szUITitle, MB_APPLMODAL | MB_OK);


}


break;

以上所写之处,如有不详或错误之处,希望大家能够指出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: