需求描述:
最近由于邦健客户提出新需求:需要在一个系统内同时实现中英文两个语种的输入法。
即,客户的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输入法换肤换语言机制相关推荐

  1. vue 一键换肤 换主题

    该一键换肤只是定义好几个颜色,并进行简单的切换. 在src下的assets文件下面定义一个css文件夹,在对应的文件里面定义_handle.scss和_themes.scss文件,如下: image. ...

  2. 前端一键换肤换肤简单探索

    效果图 默认 蓝白 方法一.如果要控制的范围不多很小的话 使用控制类名的切换 <!DOCTYPE html> <html lang="zh-CN">< ...

  3. 一文读懂HarmonyOS服务卡片怎么换肤

    作者:zhenyu,华为软件开发工程师 关注HarmonyOS的小伙伴肯定对服务卡片已经很熟悉了.服务卡片(也简称为"卡片")是FA(FeatureAbility,元服务)的一种界 ...

  4. 换肤框架Android-Skin-Support问题记录

    换肤框架Android-Skin-Support问题记录 换肤框架Android-Skin-Support问题记录 换肤框架Android-Skin-Support问题记录 换肤框架使用 问题 1:其 ...

  5. Qt编写可换肤的中文双拼汉字输入法

    时间过得真快,不知不觉已到2015年,农历春节一眨眼就过去了,端正状态收拾心情整装待发出发. 曾经有段时间,我有一个很执着的梦想,我要导演出一部空前绝后的巨幕.不过现实无情地碾碎我的梦想,也同时将我推 ...

  6. 反思|开启B站少女心模式,探究APP换肤机制的设计与实现

    反思 系列博客是我的一种新学习方式的尝试,该系列起源和目录请参考 这里 . 概述 换肤功能 并非奇技淫巧,而是已非常普及,尤其当Android Q推出了 深色模式 之后,国内绝大多数主流应用都至少提供 ...

  7. 探究APP换肤机制的设计与实现

    /   今日科技快讯   / 近日,谷歌母公司Alphabet公布了截至6月30日的2021年第二季度财报.报告显示,Alphabet第二季度总营收为618.80亿美元,较去年同期的382.97亿美元 ...

  8. c语言中用qt写换肤,让Qt应用程序支持换肤(Skin)功能

    Qt程序一直给人的印象是正规的GUI程序的模样.在嵌入式Linux下,Qtopia的桌面看起来跟WinCE桌面没有什么两样.相对IPHONE那样的漂亮界面.实在没有什么吸引力. 因此很多嵌入式开发人员 ...

  9. android+皮肤机制,Android-skin-loader 换肤总结

    前言 最近有个换肤的需求.基于github上的这个开源框架Android-Skin-Loader.这个框架的换肤机制是使用动态加载的机制去加载皮肤包里面的内容,所谓的皮肤包是实际上是一个apk文件,里 ...

最新文章

  1. LabVIEW图像灰度测量(基础篇—7)
  2. 沉痛悼念 pip search 一路走好
  3. mysql 不同的文件系统_文件系统,数据库管理系统,操作系统之间有什么联系?...
  4. 关于解决多台linux服务器间的文件实时同步问题
  5. Python学习之旅 —— 基础篇(二)数据类型、运算、while循环
  6. UE4学习-AI导航网格的创建及修改
  7. Java I/O学习——File
  8. 在数组中查找指定元素_JavaScript之学underscore在数组中查找指定元素
  9. Axure经典实例高保真交互下载(微信元件高保真交互库+微信原型交互+安卓设备模板含登录注册引导欢迎流程+ios苹果设备模板)
  10. MFC初步教程(一)
  11. 系统集成项目管理之何为系统集成
  12. 又到一年清明时,又是一年踏春季
  13. django-spirt 论坛主题
  14. 嵌入式--串口、RS232、RS485通信
  15. 计算机绘制函数的应用,信息技术应用用计算机绘制函数图象 (4).pptx
  16. java基于ssm的论坛贴子网站ssm论坛项目发帖子网站论坛系统论坛源码
  17. 生物信息学算法之Python实现|Rosalind刷题笔记:010 DNA一致性序列计算
  18. 低代码之间到底有些什么区别?对比编译型平台“iVX 无远 牛刀”以及接口型平台“明道 宜搭 简道 轻流 氚云 ”
  19. OPenGL--Transform feedback示例解析
  20. 两电平直接转矩控制MATLAB,基于MATLAB/SIMULINK动态仿真模型的异步电动机直接转矩控制的研究...

热门文章

  1. java中extends ,implements的顺序问题
  2. 074_html5音频
  3. 2014年全国计算机等级一级考试复习资料,2014年全国计算机等级一级考试复习资料..doc...
  4. 王爽汇编语言C硬盘读写,王爽汇编语言学习笔记(范文).doc
  5. 软件性能测试pdf,软件性能测试解析与优化.pdf
  6. ios开发 静音键设置_iOS开发,改变系统铃声音量和静音,并非媒体播放音量
  7. 项目启动时socket自动启动_spring boot 项目在启动时调用接口
  8. python列表的嵌套,Python检查列表是否嵌套
  9. Spring 详解(二):IOC 和DI
  10. 计算最大回撤_看专业分析研究员如何一步步解读外汇市场结构,实现交易最大化盈利化!...