微软输入法TSF SampleIME 代码浅说

简介: 原文:微软输入法TSF SampleIME 代码浅说 微软提供了一个简单的TSF拼音输入法的示例SampleIME,主要的问题是:不支持数字键选候选字,不能自动上屏,没有联想功能。
原文: 微软输入法TSF SampleIME 代码浅说

微软提供了一个简单的TSF拼音输入法的示例SampleIME,主要的问题是:不支持数字键选候选字,不能自动上屏,没有联想功能。在笔者开发动态输入法Windows版时,以其为蓝本,主要针对上面几个问题进行了改造:支持数字键选,支持自动上屏,支持联想。下面从应用的角度对SmapleIME源代码进行解说,看看从按键到汉字上屏这个过程都发生了什么。

SampleIME 的源代码结构

SampleIME 的源代码有四五十个cpp文件,这些文件可以说是支离破碎,不清楚原作者为什么要这么做,非常怀疑是故意的。其中比较重要的有这么几个类:CCandidateWindow,候选字窗口;CCompositionPricessorEngine,拼写引擎;CSampleIME,主程序。另外,SampleIME还定义了一种特殊的字符串类:CStringRange,见于 SampleIMEBaseStructure.h。其他有用的类的会陆续说到。

CSampleIME 中定义了拼写引擎_pCompositionProcessorEngine  和候选字列表提供者 _pCandidateListUIPresenter,后者包含一个候选字窗口。

  • CSampleIME:
    • CCompositionProcessorEngine* _pCompositionProcessorEngine;
    • CCandidateListUIPresenter *_pCandidateListUIPresenter;
      • CCandidateWindow *_pCandidateWnd;

以上就构成了输入法的主体框架。

 

输入过程概览

输入过程,就是从用户敲击按键到文字上屏(到达预定的编辑区域)的全过程,应该说,对于 Windows 系统来说,这个过程极其地繁琐。

首先,在中文模式下,不是所有按键都会送给输入法处理,这里定义了所有支持的按键:CCompositionProcessorEngine::InitKeyStrokeTable()。注意,其中的键值,并非按键符号的ASCII码,而是键盘按键的 keycode,只不过恰好26字母的keycode==ASCII,具体请百度。

然后,当用户按下了一个按键,首先会被传递到这里:CSampleIME::OnTestKeyDown(),为什么是Test呢?就是测试以下这个按键是否需要处理。如果需要处理,就传递给CSampleIME::OnKeyDown(),也就是交给输入法处理了。当用户松开这个按键的时候,也相应地依次传递给 CSampleIME::OnTestKeyUp() CSampleIME::OnKeyUp()

接下来,被支持的按键,如果不是删除键,就被传递到这里:CSampleIME::_HandleCompositionInput();如果是删除键,则传递到:CSampleIME::_HandleCompositionBackspace();这两个分支里面各自经历了一系列过程,但最终都是调用CCompositionProcessorEngine::GetReadingStrings()产生了一个拼写文本,然后再调用CCompositionProcessorEngine::GetCandidateList()获得一个候选字列表。什么是拼写文本呢?就是输入的时候带有下划线的那部分还没有确认上屏的文本。

至此,输入法的基本面貌已经有了,但是还差一步,就是确认拼写文本,把候选字上屏。一般这是由空格或者回车来实现的。但是这个最后一步,也是极其的繁琐,最终在CSampleIME::_TerminateComposition() 结束这个拼写过程。

目录
相关文章
再学一道算法题: 九宫格输入法
再学一道算法题: 九宫格输入法
|
IDE 测试技术 开发工具
AirtestIDE这个隐藏的小助手,还没用过你就亏啦!
AirtestIDE这个隐藏的小助手,还没用过你就亏啦!
192 0
|
Windows
MacType 提升Windows字体渲染至新境界
Mac平台上有很多精美的字体,但是换到Windows下之后,这些字体真是惨不忍睹……
370 0
MacType 提升Windows字体渲染至新境界
|
Android开发
Android开发 - 获取系统输入法高度的正确姿势
问题与解决 在Android应用的开发中,有一些需求需要我们获取到输入法的高度,但是官方的API并没有提供类似的方法,所以我们需要自己来实现。
1543 0
手机使用谷歌拼音输入法几点建议
1,谷歌拼音的中文输入最好使用双拼,在这里我推荐使用自然码双拼。由于规则简单,两天时间即可完全掌握。 2,使用滑动输入,配合双拼只用滑动两个字母就可以完成快速输入汉字,而且可以输入长句子。
1385 0
|
文字识别 C# Windows
通通WPF随笔(4)——通通手写输入法(基于Tablet pc实现)
原文:通通WPF随笔(4)——通通手写输入法(基于Tablet pc实现)          从我在博客园写第一篇博客到现在已经有1年半了,我的第一篇博客写的就是手写识别,当时,客户需求在应用中加入手写输入功能,由于第三方的手写输入法都无法定制界面,所以领导决定自主开发,所以我就很简单地基于Tablet pc写了一个WPF控件,由于几个瓶颈问题,导致这个输入功能只能在我们的UI框架里使用,而无法做到像输入法那样可以输入到任意窗口。
2122 0