語言列 (文字服務)
實作語言列物件
若要支援將專案新增至語言列,文字服務必須實作物件,該物件支援 ITfSource 介面,以及其中一個 ITfLangBarItem 控件元素。 安裝專案時,語言列會藉由使用 IID_ITfLangBarItemSink 呼叫專案的 ITfSource::AdviseSink,以安裝 ITfLangBarItemSink 接收。 專案會使用 ITfLangBarItemSink 介面來通知語言列的變更,例如當專案隱藏、顯示、啟用或停用時。
您可以安裝四種類型的語言列專案,而且每個必要的介面都是從 ITfLangBarItem 建立。 以下是 ITfLangBarItem 控件元素。
元素 | 描述 |
---|---|
按鈕 | 語言列按鈕會以命令按鈕、切換控件或語言列上的功能表的形式運作。 對象必須支援 ITfLangBarItemButton 介面。 |
氣球 | 語言列氣球功能為語言列上的快顯通知。 對象必須支援 ITfLangBarItemBalloon 介面。 |
點陣圖 | 語言列位圖會在顯示點陣圖的語言列上當做靜態元素。 對象必須支援 ITfLangBarItemBitmap 介面。 |
點陣圖按鈕 | 語言列位圖按鈕會在顯示文字和點陣圖的語言列上,做為按鈕元素。 對象必須支援 ITfLangBarItemBitmapButton 介面。 |
按鈕樣式
button 元素可以做為下列任一項。 按鈕專案的函式是由在 ITfLangBarItem::GetInfo 方法中 TF_LANGBARITEMINFO 結構 dwSty le 中設定的旗標所決定。
元素 | 描述 |
---|---|
按鈕 | 按鈕會以標準命令按鈕的形式運作。 此按鈕樣式是由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 介面。 下列步驟可支援一或多個功能表延伸模組。
- 呼叫 ITfSource::AdviseSink IID_ITfSystemLangBarItemSink 時,文字服務必須儲存 ITfSystemLangBarItemSink 介面,並傳回可識別延伸模組的 Cookie 值。
- 呼叫 ITfLangBarItemButton::InitMenu 時,文字服務會呼叫延伸模組的 ITfSystemLangBarItemSink::InitMenu 方法。 文字服務必須實作方法來識別延伸模組所新增的功能表項,而不是文字服務本身新增的專案。
- 當 ITfLangBarItemButton::OnMenuSelect 使用屬於延伸模組的功能表項標識符呼叫時,文字服務會呼叫延伸模組的 ITfSystemLangBarItemSink::OnMenuSelect 方法。
- 使用適當的 Cookie 呼叫 ITfSource::UnadviseSink 時,文字服務會移除功能表延伸模組。
相關主題