UILess 模式概述

如何创建 UILessMode

创建无 UI 线程:应用程序可以通过 ITfThreadMgrEx::ActivateEx 和 ITF_AE_UIELEMENTENABLEDONLY 创建无 UI 线程。 使用此标志激活 ThreadMgr 时,只有可以控制其 UI 元素的 TIP 才会在线程上激活。 应用程序需要实现 ITfUIElementSink 接口,并建议该接口进入线程管理器。 当TIP显示其 UI 时调用 ITfUIElementSink::BeginUIElement。 应用程序可以在 pbShow 参数中返回 TRUE,以允许 TIP 在应用程序不想绘制时显示 TIP 的原始 UI。 如果应用程序不允许 TIP 的 UI,它可以在 pbShow 中返回 FALSE(请参阅下图)。 应用程序可以通过从 pElement 参数获取一些信息来自行绘制 UI。 可以是候选列表、语言栏项或 TIP 的自定义 UI。 应用程序可以通过 QIing ITfUIElement 接口了解 UI 类型。 更改 UI 后,将调用 ITfUIElementSink::UpdateUIElement。 应用程序可以比较 pElement->GetGUID() 中的 GUID,以了解应用程序当前是否绘制了该元素。

创建无 UI 感知TIP:如果 TIP 希望在不希望允许 TIP UI 的应用程序(如游戏应用程序或全屏应用程序)下运行,则应支持更少的 UI 模式。 若要减少对 UI 的感知,TIP 需要实现 ITfTextInputProcessorEx 接口。 如果未实现此接口,TIP 将不会在UILess 模式线程下激活。 此外,TIP 必须先调用 ITFUIElementMgr::BeginUIElement,然后才能显示屏幕的可见 UI。 此方法调用 ITfUIElementSink 以通知应用程序。 应用程序将决定是否可以显示。 当 TIP 调用 BeginUIElement() 时,TIP 需要具有相应 UI 的 ITfUIElement 接口。 应用程序将通过 QI 接口获取另一个 UI 专用接口,以检索用于绘制 UI 的详细信息。 系统为 TIP 预定义 ITfCandidateListUIElementITfReadingInformationUIElement。 当 TIP 希望在UILess 模式线程下显示候选列表时,TIP 必须创建 ITfCandidateListUIElement 接口的实例,并调用 ITFUIElementMgr::BeginUIElement。 当 ITfTextInputProcessorEx::ActivateEx 被调用时,TIP 已经知道线程的 UI 更少,因此它可以消除额外的自定义 UI。 但是,它当然可以实现其自己的接口,可以从中获取 QI 并尝试发出通知。 因此,TIP 和 appliITfUIElement 的划分可以协商 TIP 自定义 UI。

UIElement 支持 TIP

支持 UIElement 的 TIP 必须按 GUID_TFCAT_TIPCAP_UIELEMENTENABLED 进行分类。 GUID_TFCAT_TIPCAP_UIELEMENTENABLED 中的 TIP 必须使用 ITfUIElementMgr 来显示任何 UI,以便应用程序可以控制 UI 的可见性。

显示/隐藏 UIElement 的状态:显示/隐藏 ITfUIElement::Show ITfUIElement::IsShown 方法指示的状态是实际的可见状态。 它与 UIElement 的可用性无关。 当显示状态存在时,UIElement 应始终可用。 显示状态可通过应用程序进行控制。 应用程序可能会突然进入 UILess 模式并自行开始绘制某些 UI,通过调用 ITfUIElement::Show 并使用 FALSE 来隐藏 TIP 的所有 UI。 然后 TIP 可以选择其中一个选项。 1) TIP 可以将 UIElement 移动到隐藏状态并开始生成 UpdateUIElement。 2) TIP 可以结束 UIElement,因为 UI 元素不支持隐藏状态,TIP 调用 EndUIElementt() 结束它。

预定义的 UI 元素

候选列表:候选列表是 EA 输入的主要 UI 元素之一。 此 UI 元素提供候选列表和用于绘图的候选字符串的相应数量。

阅读信息窗口 阅读信息窗口在中文键盘输入中很常见。 它具有无法作为组合字符串插入到文档中的阶段。 一些中文输入处理器会打开一个阅读信息小窗口,显示阅读、拼音或键入信息。

UILessMode 的流程图

显示 UI LessMode 流程图的关系图。

在 TIP 通过 ITfUIElementMgr::BeginUIElement 接收到 pbShown 中的 TRUE 后,TIP 不必为 UIElement 调用 UpdateUIElement。 但是 TIP 需要调用 EndUIElement(),以便 ITfUIElementMgr 和应用程序可以跟踪 UIElement 的状态。 TIP 必须在 BeginUIElement() 在 *pbShow 中返回 FALSE 后调用 UpdateUIElement()。 要绘制 UI 的应用程序不会检查 BeginUIElement() 中的内容,它只会在 BeginUIElement() 中返回显示状态,然后再 UpdateUIElement() 中开始检查内容。 例如,候选列表 UIElement 的更新标志在第一个 UpdateUIElement() 上具有所有位。 这意味着 UIElement 的内容不必在 BeginUIElement() 中准备就绪。

显示调用“'ITUIElementMgr::BeginUIElement()”和“Application UIElementSink 的 BeginUIElement”时的关系图。显示应用程序在 *pbShow 中返回 FALSE 的关系图。uilessmode 流程图

候选列表 UIElement

关于 PageIndex:绘制候选列表的应用程序将在更改列表内容时计算每页的字符串数(TF_CLUIE_STRING 已设置)。 当候选列表可用于 UILess 模式时,更改页面索引并不好。 这意味着 TIP 的候选列表在选定内容移动到下一页时应执行分页操作,而不是滚动。 如果在选定内容移动时发生滚动,则索引页面会发生变化,应用程序需要重新计算页面索引。 TIP 可能无法预期结果。

无选择:如果候选列表没有选择,则 ITfCandidateListUIElement::GetSelection 返回S_FALSE。 第一个参数的返回值无效。