Windows CE下MUI image的实现

本文主要阐述如何实现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 ;

以上所写之处,如有不详或错误之处,希望大家能够指出

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值