初始化
本节将讨论用于确定输入方法的子例程。
可以使用 IMQueryLanguage 子例程来确定输入方法是否可用而不进行初始化。 应用程序 (工具箱) 通过调用 IMINitiize 子例程来初始化特定于语言环境的输入法,该子例程初始化特定于语言环境的输入法编辑器 (IMED)。 这个子例程使用 LOCPATH 环境变量来搜索由 LANG 环境变量命名的输入方法。 LOCPATH 环境变量指定了一组用来搜索输入方法的目录名。
如果找到了输入方法, IMInitialize 子例程使用 load 子例程来装入输入方法,并连接 imkeymap 文件。 在访问输入方法时,会返回一个 IMFep(input method front-end processor,输入方法前端处理器)类型的对象。 IMFep 应被作为不透明结构处理。
在调用 IMInitialize 子例程时,每一个 IMFep 都继承语言环境的代码集。 因此, IMFilter 和 IMLookupString 子例程返回的字符串位于语言环境的代码集中。 在调用 IMInitialize 子例程之后更改语言环境不影响 IMFep 的代码集。
对于每个 IMFep,应用程序可使用 IMCreate 子例程创建一个或多个 IMObject 实例。 IMObject 管理其自己的状态,并可以管理多个输入方法区域 (请参阅 输入方法区域)。 每个 IMObject 如何定义输入处理取决于和语言环境相关的代码集和键盘。 最简单的情况是,如果应用程序只管理一个与用户的对话,那就只需要一个 IMObject。 输入方法也支持其他一些用户界面,其中的应用程序允许多个与用户的对话,并且每个对话都需要一个 IMObject。
IMFep 和 IMObject 之间的区别是:IMFep 是一个将应用程序绑定到输入方法代码的句柄;IMObject 也是一个句柄,但它代表的是输入设备(比如键盘)状态的一个实例。 IMFep 不代表输入方法的状态。 每个 IMObject 被初始化为某个特定的输入状态,并且根据所接收的事件序列进行更改。
创建好 IMObject 之后,应用程序即可处理键事件。 应用程序应使用 IMFilter 和 IMLookupString 子例程将键事件传给 IMObject。 提供这些子例程是为了将 IMED 内部处理从定制的键事件映射过程中分离出来。