语言栏 (文本服务)

实现语言栏对象

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

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

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

 

按钮样式

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

元素 说明
Button 该按钮充当标准命令按钮。 此按钮样式由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 时将其删除。

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

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

扩展系统语言栏项

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

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

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

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

ITfSource::UnadviseSinkITfSource::AdviseSink

支持语言栏菜单扩展

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

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

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

如何设置文本服务框架

语言栏 (应用程序)