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;
以上所写之处,如有不详或错误之处,希望大家能够指出
微软在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;
以上所写之处,如有不详或错误之处,希望大家能够指出
相关文章推荐
- 使用volley+universal image loader实现数据缓存和读取
- 超简洁代码实现CircleImageView
- Android之ImageView实现滤镜效果(setColotFilter)
- 为imageView添加图片实现动画
- C实现PHP扩展《Image_Tool》图片常用处理工具类
- android view转化为image来实现某些功能
- 使用GPUImage 实现简单的MV特效
- iOS实时滤镜实现--基于GPUImage。
- Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上2种经典解决方法。 2014-07-04 13:17 78人阅读 评论(0) 收藏
- 详细的SDWebImage 实现过程
- ImageView实现APP底部按钮切换页面
- Volley ImageLoader实现图片瀑布流
- Android ImageButton自定义按钮的按下效果的代码实现方法分享
- 用C实现PHP扩展 Image_Tool 图片常用处理工具类的使用
- 轮播器(二)--采用两个ImageView和UIScrollView实现图片无限轮播
- border-image属性实现css边框特殊需求
- android之ImageButton实现选中改变背景,外加(图片自动适配组件大小)
- UIButton和UIImageView中Image拉伸效果的实现
- 关于SDWebImage中下载图片和缓存图片的实现原理
- javascript实现鼠标移到Image上方时显示文字效果的方法