语言栏 (文本服务)
实现语言栏对象
若要支持将项添加到语言栏,文本服务必须实现支持 ITfSource 接口和 ITfLangBarItem 控件元素之一的对象。 安装项后,语言栏会通过使用 IID_ITfLangBarItemSink调用项的 ITfSource::AdviseSink 来安装 ITfLangBarItemSink 接收器。 该项使用 ITfLangBarItemSink 接口通知语言栏更改,例如,当项目处于隐藏、显示、启用或禁用状态时。
可以安装四种类型的语言栏项,每个必需的接口都是从 ITfLangBarItem 创建的。 以下是可能的 ITfLangBarItem 控件元素。
元素 | 说明 |
---|---|
Button | 语言栏按钮充当命令按钮、切换控件或语言栏上的菜单。 对象必须支持 ITfLangBarItemButton 接口。 |
气球 | 语言栏气球用作语言栏上的弹出通知。 对象必须支持 ITfLangBarItemBalloon 接口。 |
Bitmap | 语言栏位图用作显示位图的语言栏上的静态元素。 对象必须支持 ITfLangBarItemBitmap 接口。 |
位图按钮 | 语言栏位图按钮充当显示文本和位图的语言栏上的按钮元素。 对象必须支持 ITfLangBarItemBitmapButton 接口。 |
按钮样式
button 元素可以充当以下任一项。 按钮项的功能由 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 时将其删除。
若要将项添加到语言栏,文本服务会使用 IID_ITfLangBarItemMgr调用 ITfThreadMgr::QueryInterface 来获取 ITfLangBarItemMgr 接口。 然后,文本服务使用指向语言栏项对象的指针调用 ITfLangBarItemMgr::AddItem 。
停用时,文本服务必须删除该项。 文本服务使用用于添加项的同一 ITfLangBarItemMgr 接口,或者获取接口的另一个实例。 然后,文本服务使用要删除的项的接口指针调用 ITfLangBarItemMgr::RemoveItem 。
扩展系统语言栏项
TSF 提供向现有语言栏菜单添加菜单项的功能。 这使文本服务能够向另一个文本服务的菜单添加项,而无需向工具栏添加单独的按钮。 这也使菜单项能够组织成逻辑组。 例如,为标准语音文本服务提供附加功能的文本服务可以将项添加到语音文本服务菜单,而不是添加自己的顶级菜单按钮。
文本服务通过实现支持 ITfSystemLangBarItemSink 接口的对象来提供语言栏菜单扩展。 此接口的工作方式与菜单按钮的 ITfLangBarItemButton 接口完全相同。 显示菜单时,要扩展的文本服务将调用 ITfSystemLangBarItemSink::InitMenu。 该扩展使用传递给 InitMenu 的 ITfMenu 接口将项添加到菜单。 当用户选择由扩展添加的项时,要扩展的文本服务使用所选菜单项的标识符调用 ITfSystemLangBarItemSink::OnMenuSelect 。
若要安装语言栏菜单扩展,文本服务将完成以下步骤。
- 通过使用要扩展的项的 GUID 调用 ITfLangBarItemMgr::GetItem 来获取要扩展的项的 ITfLangBarItem 接口。
- 使用 IID_ITfSource 调用 ITfLangBarItem::QueryInterface,获取要扩展的项的 ITfSource 接口。
- 使用IID_ITfSystemLangBarItemSink和指向 ITfSystemLangBarItemSink 对象的指针调用 ITfSource::AdviseSink。 如果 ITfSource::AdviseSink 失败,则文本服务不支持菜单扩展。
ITfSource::UnadviseSinkITfSource::AdviseSink
支持语言栏菜单扩展
文本服务可以让其他文本服务向其语言栏菜单添加项目,如上所示。 必须发布其 GUID 的文本服务,以便可以通过调用 ITfLangBarItemMgr::GetItem 来获取该项。
若要支持菜单扩展,文本服务必须支持 ITfSource 接口。 以下步骤启用对一个或多个菜单扩展的支持。
- 调用带有 IID_ITfSystemLangBarItemSink 的 ITfSource::AdviseSink 时,文本服务必须存储 ITfSystemLangBarItemSink 接口,并返回标识扩展的 Cookie 值。
- 调用 ITfLangBarItemButton::InitMenu 时,文本服务将调用扩展的 ITfSystemLangBarItemSink::InitMenu 方法。 文本服务必须实现一种方法来标识扩展添加的菜单项,而不是由文本服务本身添加的项。
- 当使用属于扩展的菜单项标识符调用 ITfLangBarItemButton::OnMenuSelect 时,文本服务将调用扩展的 ITfSystemLangBarItemSink::OnMenuSelect 方法。
- 使用相应的 Cookie 调用 ITfSource::UnadviseSink 时,文本服务会删除菜单扩展。
相关主题