無 UI 模式概觀
如何建立UILessMode
建立無 UI 線程: 應用程式可以透過 ITfThreadMgrEx::ActivateEx 搭配 ITF_AE_UIELEMENTENABLEDONLY,將 UI 設為較少線程。 使用此旗標啟用 ThreadMgr 時,線程上只會啟動可控制其 UI 元素的 TIP。 應用程式需要實 作 ITfUIElementSink 介面,並建議介面進入線程管理員。 當 TIP 顯示其 UI 時,會呼叫 ITfUIElementSink::BeginUIElement 。 當應用程式不想繪製時,應用程式可以在 pbShow 參數中傳回 TRUE ,以允許 TIP 顯示 TIP 的原始 UI。 如果應用程式不允許 TIP 的 UI,它可以在 pbShow 中傳回 FALSE (請參閱下圖)。 應用程式可以從 pElement 參數取得一些資訊,藉以自行繪製 UI。 它可以是候選清單、語言列專案或 TIP 的自定義 UI。 應用程式可以透過 QIing ITfUIElement 介面知道 UI 種類。 變更 UI 時,會呼叫 ITfUIElementSink::UpdateUIElement。 應用程式可以比較 pElement-GetGUID>() 中的 GUID,以瞭解應用程式目前是否繪製元素。
製作無 UI 感知提示: 如果提示想要在不想允許 TIP 的 UI 的應用程式下執行,例如遊戲應用程式或全螢幕應用程式,提示應該支援較少的 UI 模式。 若要減少UI感知,TIP必須實 作ITfTextInputProcessorEx 介面。 如果未實作此介面,在UI模式線程下將不會啟動TIP。 此外,TIP 必須先呼叫 ITFUIElementMgr::BeginUIElement ,才能顯示畫面可見的 UI。 此方法會 呼叫 ITfUIElementSink 以通知應用程式。 應用程式會決定是否可以顯示。 當 TIP 呼叫 BeginUIElement(),TIP 必須有 對應 UI 的 ITfUIElement 介面。 應用程式會 QI 介面以取得另一個 UI 特定介面,以擷取更多資訊來繪製 UI。 系統會預先定義 TIP 的 ITfCandidateListUIElement 和 ITfReadingInformationUIElement。 當 TIP 想要在 UI 較少模式線程下顯示候選清單時,TIP 必須建立 ITfCandidateListUIElement 介面的實例,並呼叫 ITFUIElementMgr::BeginUIElement。 呼叫 ITfTextInputProcessorEx::ActivateEx 時,TIP 已經知道線程的 UI 較少,因此可以消除額外的自定義 UI。 不過,當然,它可以實作其本身的介面,以便進行 QIed,並嘗試發出通知。 因此,TIP 和 appliITfUIElement整合可以交涉 TIP 自定義 UI。
UIElement 支援提示
支援UIElement的TIP必須依GUID_TFCAT_TIPCAP_UIELEMENTENABLED分類。 GUID_TFCAT_TIPCAP_UIELEMENTENABLED中的 TIP 必須使用 ITfUIElementMgr 來顯示任何 UI,讓應用程式可以控制 UI 的可見性。
顯示/隱藏 UIElement 的狀態:顯示/隱藏 ITfUIElement::Show 或 ITfUIElement::IsShown 方法所指出的狀態是實際的可見狀態。 這與 UIElement 的可用性無關。 當顯示狀態存在時,UIElement 應該一律可供使用。 顯示狀態可從應用程式控制。 應用程式可能會突然移至無UI模式並自行開始繪製某些UI,方法是呼叫 ITfUIElement::Show with FALSE 以隱藏 TIP 的所有 UI。 然後 TIP 可以採用其中一些選項。 1) 提示可以將 UIElement 移至 [隱藏狀態],並開始產生 UpdateUIElement。 2) 提示可以完成 UIElement,因為 UI 元素不支援隱藏狀態,而提示會呼叫 EndUIElement() 來完成它。
預先定義的UI元素
候選清單: 候選清單是EA輸入的主要UI元素之一。 此 UI 元素會提供候選清單和對應的候選字串數目來繪製。
閱讀資訊視窗 閱讀資訊視窗適用於中文鍵盤輸入。 它有無法插入檔中做為組合字串的階段。 部分中文輸入處理器會開啟小型閱讀信息視窗,以顯示閱讀、注音或輸入資訊。
UILessMode 的流程圖
在 ITfUIElementMgr::BeginUIElement 的 *pbShown 中收到 TRUE 之後,TIP 就不需要呼叫 UIElement 的 UpdateUIElement。 但是 TIP 需要呼叫 EndUIElement(),因此 ITfUIElementMgr 和應用程式可以追蹤 UIElement 的狀態。 TIP 必須在 BeginUIElement() 在 *pbShow 中傳回 FALSE 之後呼叫 UpdateUIElement()。 想要繪製 UI 的應用程式不會檢查 BeginUIElement() 中的內容,它只會傳回 BeginUIElement() 的顯示狀態,並開始檢查 UpdateUIElement() 的內容。 例如,候選清單 UIElement 的更新旗標在第一個 UpdateUIElement() 中具有所有位。 這表示 UIElement 的內容不需要在 BeginUIElement() 準備就緒。
候選清單 UIElement
關於 PageIndex: 繪製候選清單的應用程式會在清單的內容變更時計算每個頁面的字串數目(TF_CLUIE_STRING已設定)。 當候選清單可供UILess模式使用時,變更頁面索引並不容易。 這表示 TIP 的候選清單應該執行分頁,而不是在選取範圍移至下一頁時捲動。 如果在選取範圍移動時捲動捲動,頁面索引就會變更,而且應用程式必須重新計算頁面索引。 TIP 可能無法預期結果。
無選取範圍:如果候選清單沒有選取專案,ITfCandidateListUIElement::GetSelection 會傳回S_FALSE。 第一個參數的傳回值無效。