输入法开发——<二>元素
输入法和应用使用的服务时需要实现几个元素
我的文章目前提及的都涉及很浅,之后代入编写都会再讲的
通用元素
线程管理器
线程管理器是 TSF 管理器的基本组件。 线程管理器执行与应用程序和文本服务相关的常见任务
客户端标识符
DocumentMgr
应用程序维护的每个文档有一个单独的文档管理器对象。 应用程序使用文档管理器创建、编辑上下文,添加上下文到上下文堆栈,从上下文堆栈中删除上下文。
Context
文本服务通常用于编辑状态的文字。活动文本在一个活动 DocumentMgr 的栈顶。使用 ITfThreadMgr::GetFocus 可以获取活动的 DocumentMgr (也就是光标)
使用 ITfDocumentMgr::GetTop 获取栈顶指针。
EditCoockies 就是下文要提的文本锁。
Range
两个值描述一个范围,用于选定文本。前值必须小于后值。

重力:左后、右前
1、向前


2、向后


克隆与备份:
克隆是不包括静态数据的范围的副本。 复制区域的定位点,但克隆仍涵盖上下文中的一系列文本。 克隆在所有方面都是范围对象。 这意味着克隆区域的文本和属性是动态的,如果克隆范围的文本和/或属性发生更改,则会更改。
备份在备份作为静态数据时存储范围的文本和属性。 备份还会克隆原始区域,以便可以跟踪对原始范围的大小和位置所做的更改。 这意味着备份范围的文本和属性是静态的,如果备份范围的文本和/或属性发生更改,则不会更改。
下面是微软的示例

Properties
文本服务框架 (TSF) 提供将元数据与一系列文本关联的属性。 这些属性包括但不限于显示属性,例如粗体文本、文本的语言标识符以及文本服务提供的原始数据
Compartments
用于特殊情况获取信息。(跨进程、线程等)
Compositions
合成是一种临时输入状态,它使文本服务能够同时向应用程序和用户指定输入文本仍处于更改状态。 应用程序可以并且应该获取有关合成的显示属性信息,并使用此信息向用户显示组合状态。下一章有。
输入法
文本服务注册
注册文本服务、注册语言配置文件、注册类别
语言栏
实现语言栏对象、按钮样式、实现菜单按钮、将项目添加到语言栏、扩展系统语言栏项、支持语言栏菜单扩展
编辑会话
这是必须有的,这里的锁主要是线程安全和内存安全,与数据安全关系不大
提供显示属性
应用显示属性、提供显示属性信息对象
应用程序
文本存储
应用字符位置(ACP)、Anchor-Based应用程序、文档访问控制、如何初始化文本存储、如何修改文本存储
ACP 有点像链表
文档锁定
文档锁定协议、文档锁的类型、异步和同步请求、授予锁、锁定强制实施
使用显示属性
我是对象的所有者没问题吧?
嵌入对象
可用于插入的对象
语言栏
无 UI 模式
后面讲,全屏应用托管输入法