语言栏 (文本服务)

实现语言栏对象

若要支持将项添加到语言栏,文本服务必须实现支持 ITfSource 接口的对象,以及其中一个 ITfLangBarItem 控件元素。 安装项目后,语言栏通过调用项的 ITfSource::AdviseSink IID_ITfLangBarItemSink 来安装 ITfLangBarItemSink 接收器。 该项使用 ITfLangBarItemSink 接口通知语言栏更改,例如,当项目隐藏、显示、启用或禁用时。

可以安装四种类型的语言栏项,并且从 ITfLangBarItem创建每个必需的接口。 可以 ITfLangBarItem 控件元素。

元素 描述
按钮 语言栏按钮充当命令按钮、切换控件或语言栏上的菜单。 该对象必须支持 ITfLangBarItemButton 接口。
气球 语言栏气球在语言栏上充当弹出通知。 该对象必须支持 ITfLangBarItemBalloon 接口。
位图 语言栏位图在显示位图的语言栏上充当静态元素。 该对象必须支持 ITfLangBarItemBitmap 接口。
位图按钮 语言栏位图按钮在显示文本和位图的语言栏上充当按钮元素。 该对象必须支持 ITfLangBarItemBitmapButton 接口。

 

按钮样式

按钮元素可以充当以下任一项。 按钮项的函数由 ITfLangBarItem::GetInfo 方法中 TF_LANGBARITEMINFO 结构 dwStyle 成员中设置的标志确定。

元素 描述
按钮 该按钮充当标准命令按钮。 此按钮样式由TF_LBI_STYLE_BTN_BUTTON样式标识。 单击项时调用 ITfLangBarItemButton::OnClick。 不使用 ITfLangBarItemButton::InitMenu 和 ITfLangBarItemButton::OnMenuSelect。
切换按钮 该按钮充当可维护单击状态的切换控件,类似于复选框。 此按钮样式由TF_LBI_STYLE_BTN_TOGGLE样式标识。 单击项时调用 ITfLangBarItemButton::OnClick。 不使用 ITfLangBarItemButton::InitMenu 和 ITfLangBarItemButton::OnMenuSelect。
菜单 按钮充当下拉菜单。 此按钮样式由TF_LBI_STYLE_BTN_MENU样式标识。 单击按钮时调用 ITfLangBarItemButton::InitMenu。 当用户在菜单中选择某个项时,语言栏会调用 ITfLangBarItemButton::OnMenuSelect,其中包含所选菜单项的标识符。 未使用 ITfLangBarItemButton::OnClickis。

 

实现菜单按钮

当用户单击菜单按钮时,语言栏将调用 ITfLangBarItemButton::InitMenu。 该项使用传递给 InitMenu 的 ITfMenu 接口 向菜单添加项。

若要向菜单添加子菜单,请使用 TF_LBMENUF_SUBMENU 调用 ITfMenu::AddMenuItem。 完成此作后,在 AddMenuItem 的 ppMenu 参数中返回表示子菜单的新 ITfMenu 对象。 此新菜单对象用于向子菜单添加项。

当用户在菜单中选择某个项时,语言栏会调用 ITfLangBarItemButton::OnMenuSelect,其中包含所选菜单项的标识符。

将项添加到语言栏

当调用其 ITfTextInputProcessor::Activate 方法时,文本服务应将其项添加到语言栏,并在调用其 ITfTextInputProcessor::D eactivate 时将其删除。

若要将项添加到语言栏,文本服务通过调用具有IID_ITfLangBarItemMgr的 ITfThreadMgr::QueryInterface 来获取 ITfLangBarItemMgr 接口。 然后,文本服务使用指向语言栏项对象的指针调用 ITfLangBarItemMgr::AddItem

在停用时,文本服务必须删除该项。 文本服务使用用于添加项或获取接口的另一个实例的相同 ITfLangBarItemMgr 接口。 然后,文本服务使用要删除的项的接口指针调用 ITfLangBarItemMgr::RemoveItem

扩展系统语言栏项

TSF 提供将菜单项添加到现有语言栏菜单的功能。 这样,文本服务就可以将项添加到另一个文本服务的菜单中,而无需向工具栏添加单独的按钮。 这也使菜单项可以组织成逻辑组。 例如,为标准语音文本服务提供其他功能的文本服务可以将项添加到语音文本服务菜单,而不是添加自己的顶级菜单按钮。

文本服务通过实现支持 ITfSystemLangBarItemSink 接口的对象来提供语言栏菜单扩展。 此接口的工作方式与菜单按钮的 ITfLangBarItemButton 接口完全相同。 显示菜单时,要扩展的文本服务将调用 ITfSystemLangBarItemSink::InitMenu。 该扩展使用传递给 InitMenuITfMenu 接口向菜单添加项。 当用户选择扩展添加的项时,要扩展的文本服务将调用 ITfSystemLangBarItemSink::OnMenuSelect,其中包含所选菜单项的标识符。

若要安装语言栏菜单扩展,文本服务将完成以下步骤。

  1. 通过调用 ITfLangBarItemMgr::GetItem,获取要扩展的项的 ITfLangBarItem 接口,该接口 GUID
  2. 通过使用 IID_ITfSource 调用 ITfLangBarItem::QueryInterface,获取要扩展的项的 ITfSource 接口。
  3. 使用 IID_ITfSystemLangBarItemSink 和指向 ITfSystemLangBarItemSink 对象的指针调用 ITfSource::AdviseSink。 如果 ITfSource::AdviseSink 失败,文本服务不支持菜单扩展。

ITfSource::UnadviseSinkITfSource::AdviseSink

支持语言栏菜单扩展

文本服务可让其他文本服务将项目添加到其语言栏菜单中,如上所示。 必须发布其 GUID 的文本服务,以便可以通过调用 ITfLangBarItemMgr::GetItem来获取该项。

若要支持菜单扩展,文本服务必须支持 ITfSource 接口。 以下步骤支持一个或多个菜单扩展。

  1. 调用 ITfSource::AdviseSink IID_ITfSystemLangBarItemSink时,文本服务必须存储 ITfSystemLangBarItemSink 接口,并返回用于标识扩展的 Cookie 值。
  2. 调用 ITfLangBarItemButton::InitMenu 时,文本服务将调用扩展的 ITfSystemLangBarItemSink::InitMenu 方法。 文本服务必须实现一种方法来标识扩展添加的菜单项,而不是文本服务本身添加的项。
  3. 当使用属于扩展的菜单项标识符调用 ITfLangBarItemButton::OnMenuSelect 时,文本服务将调用扩展 ITfSystemLangBarItemSink::OnMenuSelect 方法。
  4. 使用相应的 Cookie 调用 ITfSource::UnadviseSink 时,文本服务将删除菜单扩展。

如何设置文本服务框架

语言栏(应用程序)