語言列 (文字服務)
實作語言列物件
若要支援將專案新增至語言列,文字服務必須實作支援 ITfSource 介面的物件,以及其中一個 ITfLangBarItem 控制項元素。 安裝專案時,語言列會呼叫專案的ITfSource::AdviseSink與 IID_ITfLangBarItemSink 來安裝ITfLangBarItemSink接收。 專案會使用 ITfLangBarItemSink 介面來通知語言列的變更,例如當專案隱藏、顯示、啟用或停用時。
您可以安裝四種類型的語言列專案,並從 ITfLangBarItem建立每個必要的介面。 以下是可能的 ITfLangBarItem 控制項元素。
元素 | Description |
---|---|
按鈕 | 語言列按鈕會以命令按鈕、切換控制項或語言列上的功能表的形式運作。 物件必須支援 ITfLangBarItemButton 介面。 |
氣球 | 語言列方塊會以語言列上的快顯通知的形式運作。 物件必須支援 ITfLangBarItemBalloon 介面。 |
點陣圖 | 語言列點陣圖會在顯示點陣圖的語言列上做為靜態元素。 物件必須支援 ITfLangBarItemBitmap 介面。 |
點陣圖按鈕 | 語言列點陣圖按鈕會在顯示文字和點陣圖的語言列上做為按鈕元素。 物件必須支援 ITfLangBarItemBitmapButton 介面。 |
按鈕樣式
按鈕元素可以做為下列任一項運作。 按鈕專案的函式是由ITfLangBarItem::GetInfo方法中TF_LANGBARITEMINFO結構之 dwStyle成員中設定的旗標所決定。
元素 | Description |
---|---|
按鈕 | 按鈕會以標準命令按鈕的形式運作。 此按鈕樣式是由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 時,文字服務會移除功能表延伸模組。
相關主題