作者:朱晓旭,刁红军(苏州大学,江苏苏州 215006)

摘要
  嵌入式操作系统在PDA与智能电话等手持设备领域的应用日益广泛,如何在这些设备中方便、快速输入汉字需要解决,所以将目前PC平台上的优秀输入法移植到PDA与智能电话中是一个具有实际意义的问题。本文以在PocketPC平台上设计一个Unicode内码输入法为例,介绍PocketPC的输入法接口与编程实现一个PocketPC输入法的过程。
关键词:WindowsCE;IM(输入法);PDA;PocketPC
中图分类号:TP311.5     文献标识码:A
引言
  随着嵌入式应用需求的不断增加,Microsoft公司专门发布了嵌入式操作系统———WindowsCE操作系统,Win2dowsCE是一个模块化的操作系统,用户可以根据自己的需求选择WindowsCE中的模块架构自己的平台(例如有些移动电话不需要触摸屏的模块),换句话讲用WindowsCE架构的平台其实是WindowsCE操作系统的一个子集,这些平台通常与为配套硬件结合构成一个系统,其中最著名的平台是PocketPC和SmartPhone。Microsoft希望通过PocketPC在PDA市场与Palm一争高下,期待SmartPhone在移动电话领域对Symbian操作系统发起挑战。汉字的输入方法是中文信息处理的一个重要课题,Microsoft公司在Window9x/Me/2000/XP中都提供了基于IMM-IME的输入法接口,通过该接口可以编写出与Windows中文版无缝连接的汉字输入法。目前,在桌面Windows中有许多优秀的汉字输入法,它们能够很好地满足用户快速输入或学习简单等使用需求,但是Microsoft在PocketPC简体中文版中只提供了拼音和手写输入法,难以满足所有用户需要,所以如何将PC中优秀的汉字输入法移植到PocketPC中来,是一个很具有实用意义的问题,下面通过在PocketPC中用MicrosoftEmbeddedVisualC++3.0(下文简称EVC3)实现一个Unicode内码输入法的例子来讲解在PocketPC中设计汉字输入法的技术与注意要点。
PocketPC输入法简介与接口概述
  PocketPC没有提供物理键盘,用户主要是通过触控笔和触摸屏进行操作与输入,PocketPC用户可以通过SIP(SupplementaryInputPanel,辅助输入面板)完成用户汉字输入过程,SIP是屏幕上的一块区域,它可以根据用户的需要显示或隐藏,用户可以通过选择SIP中的IM(InputMethod,输入法)进行输入,SIP中可以有多个IM,例如PocketPC预先提供的“拼音输入法”和“手写输入法”就是两个IM。IM可以在不影响系统其它功能的前提下安装或删除,而且我们可以编写自己的IM安装到系统中。PocketPC中的输入法IM作为COM进程服务器来实现的,所以在编写IM的时候需要遵循COM进程服务器规范。在PocketPC中编写汉字输入法,主要要通过IInput2Method和IIMCallback两个接口与系统交互。其中IInput2Method接口是IM的核心部分,在编写IM的时候,我们需要实现一个继承了IInputMethod接口的类,并在该类中具体实现IInputMethod接口提供的方法,IInputMethod接口主要提供的方法与说明参见表1。
表1 IInputMethod接口简介方法名称方法说明
Select当用户选择IM时,IM所在DLL被加载,然后系统调用此方法,IM应该在此方法中创建自己的窗口与初始化相关数据。
Deselect当用户撤消使用该IM时(例如选择其它IM),IM应该在此方法中销毁自己创建的窗口,并做善后工作。
Showing当IM将被显示时,系统调用此方法。
Hiding当IM将被隐藏时,系统调用此方法。
GetInfo系统可以通过该方法获取IM的信息。
ReceiveSipInfo当系统显示SIP的时候将调用该方法。
RegisterCallback当选择IM后,系统将调用该函数以传递I2IMCallback接口的指针。
GetImData获取IM的专用数据,大多数IM在该方法中不做操作直接返回。
SetImData设置IM的专用数据,大多数IM在该方法中不做操作直接返回。
UserOptionDlg当系统需要显示IM的配置对话框时自动调用此方法。IM需要在方法中创建并显示配置对话框
  IInputMethod接口简介方法名称方法说明Select当用户选择IM时,IM所在DLL被加载,然后系统调用此方法,IM应该在此方法中创建自己的窗口与初始化相关数据。Deselect当用户撤消使用该IM时(例如选择其它IM),IM应该在此方法中销毁自己创建的窗口,并做善后工作。Showing当IM将被显示时,系统调用此方法。Hiding当IM将被隐藏时,系统调用此方法。GetInfo系统可以通过该方法获取IM的信息。ReceiveSipInfo当系统显示SIP的时候将调用该方法。RegisterCallback当选择IM后,系统将调用该函数以传递I2IMCallback接口的指针。GetImData获取IM的专用数据,大多数IM在该方法中不做操作直接返回。SetImData设置IM的专用数据,大多数IM在该方法中不做操作直接返回。UserOptionDlg当系统需要显示IM的配置对话框时自动调用此方法。IM需要在方法中创建并显示配置对话框。IIMCallback接口是IM回掉系统的途径,例如当IM根据用户的输入码检索到对应的字或词的时候就可以通过该接口将字或词回发给系统,该接口对于编写IM而言主要是调用该接口提供的方法,IIMCallback接口主要提供的方法与说明参见表2。
表2 IIMCallback接口简介方法名称方法说明
SetImInfoIM可以调用该方法控制自己在屏幕上的大小和位置。
SendVirtualKeyIM可以通过该方法向系统发送一个虚拟键。
SendCharEventsIM可以通过该方法向具有焦点的应用程序发送一个字符。
SendStringIM可以通过该方法向具有焦点的应用程序发送字符串。
在PocketPC中注册输入法
  PocketPC是通过检索[HKEYCLASSESROOT]\CLSID中符合条件的键来枚举系统的输入法的,所以在PocketPC中注册输入法的任务就是在[HKEYCLASSESROOT]\CLSID中建一个唯一的CLSID键,在该键中设置输入法的名称和输入法文件的dll文件路径,另外必须在该键中建立一个名为“IsSIPInputMethod”的子键,并且将它的值设为1。通常我们编写一个程序进行上述工作,该程序在进行输入法安装的时候自动运行,这样自己编写的输入法就可以被PocketPC枚举并使用。
UnicodeIM的实现步骤
  在实现PocketPC上IM的时候主要设计四个步骤,首先建立IM的工程,然后必须实现继承IInputMethod接口的类,接着编写窗口的消息循环处理代码,最后实现从输入码到对应字\词的转换检索模块。下面就Unicode汉字输入法的实现来具体加以描述。
  建立IM工程
  首先在EVC中新建一个名为CUnicodeInput的COM工程,在工程中添加一个类CUnicodeIM,该类继承IInput2Method接口,然后添加一个继承IclassFactory接口的Uni2codeClassFactory类,在UnicodeClassFactory的CreateIn2stance成员函数中添加新建CunicodeIM类对象的代码,接着在COM的DllGetClassObject函数中添加代码创建Uni2codeClassFactory类的对象,这样就完成了一个输入法COM的基本的结构。以上工作都可以通过EVC的AppWizard辅助快速完成。
  实现CUnicodeIM类
  这里我们主要实现CUnicodeIM类的Select、Deselect、RegisterCallback、Showing和Hiding成员函数,因为当用户选择IM的时候系统立刻就会调用Select方法,所以Select中的代码完成加载需要的图片、注册窗口类和用注册的窗口类创建窗口的工作,Deselect函数中添加销毁窗口和撤消窗口类,RegisterCallback函数中将系统传过来的参数保存在指针变量中,这样就可以在后面通过该指针调用IIM2Callback接口的方法,在Showing和Hiding函数中添加控制IM窗口显示与隐藏的代码。
  消息循环处理代码的实现
  本步骤主要实现IM与用户交互的功能,需要编写软键盘和用户输入码显示窗口的消息循环处理函数以及用户输入的捕获与处理,UnicodeIM中是利用了软键盘窗口的一块区域显示用户输入码,所以只编写了一个消息循环处理函数,UnicodeIM主要需要处理WMCREATE、WMPAINT、WMLBUTTONUP和WMDESTROY消息。WMCREATE和WMDESTROY的消息处理代码主要完成软键盘和用户输入码显示窗口初试化和销毁工作。在WMPAINT消息处理代码中我们是通过绘制矩形和输出文本实现了软键盘窗口中按键和用户输入码显示的功能,当然设计人员也可以在图形、图象处理软件中绘制精美的软键盘图片,然后加载以显示实现美观的效果。在WMLBUTTONUP消息的处理代码中根据LPARAM参数计算出触控笔点击处的按键,接着判断按键如果是回车、空格等键则通过IIMCallback接口的SendCharEvents方法直接传给应用程序,如果是有效的输入法的码元(如‘0’—‘9’或‘A’—‘F’),就保存在存储用户输入码的数组中,当用户已经输入四位输入码时就调用输入码到对应汉字的检索模块。
  汉字检索模块
  因为我们实现的是Unicode输入法,所以从输入码到汉字的检索模块比较简单,实际是通过计算而不是检索,只要将用户的4位输入码变成BCD码,然后通过移位拼装,就可以得到对应的汉字的Unicode内码。
  具体实现参见如下代码:
//====================
//本函数将用户输入的0-9和A-F变成BCD码
//====================
WORD Unicode2BCD(TCHARinput)
{
  if(input>=0x0030&&input<=0x0039)
    return(WORD)(input-0x30);
  elseif(input>=TEXT(’A’)&&input<=TEXT(’F’))
    return(WORD)(input-55);
  else
    return0xFF;
}
//下面的代码片段将用户的输入码变成BCD码后移位保存。
BYTEout[4]={0};
out[1]=(BYTE)(Unicode2BCD(srm[0])<<4);
out[1]|=(BYTE)(Unicode2BCD(srm[1]));
out[0]=(BYTE)(Unicode2BCD(srm[2])<<4);
out[0]|=(BYTE)(Unicode2BCD(srm[3]));//通过IIMCallback接口的SendString将汉字发给应用程序。appIMCallback->SendString((TCHAR3)out,1);
  通过以上的步骤就可以建立一个PocketPC中的Uni2code输入法,完成最基本的根据用户输入的Unicode输入码输入对应汉字的功能。

PocketPC中汉字输入法分析与实现(…相关推荐

  1. IME输入法编程:第一章 Windows9x系统下汉字输入法的基本原理

    IME输入法编程 第一章 Windows9x系统下汉字输入法的基本原理 Windows系统下汉字输入法实际上是将输入的标准ascii字符串按照一定的编码规则转换为汉字或汉字串,进 入到目的地. 由于应 ...

  2. Windows9x系统下汉字输入法的基本原理

    Windows9x 系统下汉字输入法的基本原理 Windows 系统下汉字输入法实际上是将输入的标准 ascii 字符串按照一定的编码规则转换为汉字或汉字串,进入到目的地.由于应用程序各不相同,用户不 ...

  3. java 判断汉字音调_Java中汉字转拼音pinyin4j用法实例分析

    本文实例讲述了Java中汉字转拼音pinyin4j用法.分享给大家供大家参考,具体如下: 汉字转换拼音在日常开发中是个很常见的问题.例如我们伟大的12306,在地名中输入"WH", ...

  4. 计算机常用汉字输入法的使用,计算机的基本操作汉字输入法--.ppt

    第六章 计算机的基本操作 --汉字输入法 6.2 汉字输入法 6.2.1 汉字输入法分类 • 分类:键盘汉字输入编码方案可以归为拼音.字形. 音形三大类. • 1.拼音方案:可以分为全拼音.压缩拼音. ...

  5. 游戏中汉字显示的实现与技巧

    转自: http://www.cppblog.com/richardhe/archive/2009/01/04/63851.html 游戏中汉字显示的实现与技巧[ZZ] 作者:炎龙工作室 千里马肝 版 ...

  6. 我的汉字输入法编码方案

    很早就有了这个东西,因为一直没学会编写输入法程序,所以就没有拿出来现眼. 方案尽量简化,主要从汉字本身就具备的偏旁部首出发,用偏旁部首的读音的声母字符,按笔画顺序编码即是. 从前不知道,几乎每一个偏旁 ...

  7. 计算机汉字的输入和编辑教案,微机教案:汉字输入法

    <微机教案:汉字输入法>由会员分享,可在线阅读,更多相关<微机教案:汉字输入法(4页珍藏版)>请在人人文库网上搜索. 1.微机教案:汉字输入法特征码标签:特征码课题 汉字输入法 ...

  8. 计算机地址输入法教案,《汉字输入法》教案

    第1篇:<汉字输入法>教案 课题:汉字输入法 教学目的: (1)了解汉字输入法的种类,及常用的中文输入方法. (2)掌握智能abc输入法的特点和功能. (3)初步掌握智能abc输入法的使用 ...

  9. 位运算—统计文本文件中汉字的个数

    声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生. C语言进行底层开发时经常会用到位运算,比如操作系统中的各种描述符,不同的位代表着不同的含义,经常需要按位赋值.关于位运算的细节,教 ...

  10. 手机汉字输入法欲立国家标准

    国人使用手机有两大特点,一是爱换机,一是爱发短信.来自国家信息产业部的统计显示,目前我国手机用户已经超过了4亿多,2005年共发短信3000多亿条.而其中,数字键盘汉字输入法已成为我国1/3人口的日常 ...

最新文章

  1. 谱聚类 Spectral Clustering
  2. 被黑客们使用的代码混淆技术
  3. iOS开发之--Masonry多个平均布局
  4. 货郎担问题TSP(dp解法)
  5. matlab2010alinux下载,Linux matlab 2010a 下载与安装过程
  6. TObject简要说明-对象的创建流程
  7. 指令系统寻址方式——指令寻址,数据寻址
  8. 风讯CMS常见问题锦集
  9. mysql 执行存储过程_MySQL存储过程的3种循环
  10. python语言中最基本的概念_Python 学习之路-基本的概念(三)
  11. centos设置服务开机启动失败问题
  12. 面向项目(十)—— 头文件、源文件的组织
  13. 过来人谈在美国大学里的中国研究生
  14. Matlab 遗传算法gaot、gatbx工具箱安装(出现未找到 ‘initializega‘、‘crtbp‘等错误)
  15. knowledge transfer
  16. input隐藏域赋值数组,node获取val的值
  17. 离线数据开发之任务调度系统
  18. 网站分析行业的“前途”和“钱途”
  19. Lotus Notes Send EMail from VB or VBA
  20. Excel 神器 —— OpenPyXl

热门文章

  1. ACM/ICPC 大赛常见英语词汇
  2. web项目运行时无法重命名MySQL表问题排查
  3. P1084 [NOIP2012 提高组] 疫情控制
  4. java审批流创建及代码流程
  5. 《开源之迷》:每天那么多人念叨的开源,究竟该如何解读?
  6. 自动化测试全流程总结
  7. 浏览器htmlcss面试题
  8. 燕十八-PHP公益培训-学习
  9. [geoserver] appears to have started a thread named [FileSystemWatcher-1] but has failed to stop it.
  10. 微信小程序踩坑——项目内文件夹删除不掉