博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微软输入法TSF SampleIME 代码浅说
阅读量:6695 次
发布时间:2019-06-25

本文共 1548 字,大约阅读时间需要 5 分钟。

原文:

微软提供了一个简单的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() 结束这个拼写过程。

转载地址:http://ydvoo.baihongyu.com/

你可能感兴趣的文章
C++学习-10
查看>>
操作系统与c语言
查看>>
frame和iframe区别
查看>>
PHP验证码无法显示
查看>>
k8s/02中文文档学习笔记
查看>>
网站平台架构演变史(三) - 数据库表的查询优化
查看>>
步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)
查看>>
前端地址大全
查看>>
DAY19-Django之model进阶
查看>>
从0移植uboot(六) _实现网络功能
查看>>
Linux命令——du
查看>>
Cube Stacking
查看>>
WPF中DataGrid的ComboBox的简单绑定方式(绝对简单)
查看>>
UIViewContentMode各类型效果
查看>>
转:开启nginx的gzip压缩的相关参数设置
查看>>
转:网站架构-从无到有
查看>>
MUI的一些笔记
查看>>
Jenkins可持续集成Python自动化脚本
查看>>
Linux系统起源及主流发行版
查看>>
跨域问题、跨域cookie问题
查看>>