PenInputPanel 使用者的 TextInputPanel
Windows Vista 的發行包含平板電腦輸入面板的新可程式性物件,可提供應用程式如何使用和與輸入面板互動的新可能性。 第一次應用程式開發人員可以將In-Place輸入面板圖示放在文字方塊中,或將其放在客戶手寫筆跡介面的角落,以提供替代輸入模式的存取權。 當輸入面板圖示展開至 [輸入面板] In-Place[輸入面板] 之後,開發人員就具有相同的定位控制權。 這可確保In-Place輸入面板永遠不會與應用程式版面配置中的重要使用者介面元素重迭,或甚至重新排列應用程式的使用者介面,讓In-Place輸入面板的空間變成空間,然後將它放在保留空間中。 新的可程式性模型不僅包含對定位的支援,開發人員也可以自訂輸入區域、更正模式,以及輸入面板許多其他屬性,以量身打造應用程式中的文字輸入體驗。 最後,應用程式第一次可以接收使用者筆跡,除了已辨識的文字之外,還可以從輸入面板插入文字。 這可啟用新的應用程式案例,包括變更追蹤記錄中的筆跡,以及允許使用者編輯或檢視應用程式中的筆跡。 這些新的可程式性功能是 Microsoft 收到有關輸入面板開發人員故事的直接意見反應結果,並代表更緊密整合應用程式和輸入面板的第一步。
為了提供這個擴充的輸入面板可程式設計模型,以程式設計方式與輸入面板互動, PenInputPanel 物件已被取代,並取代為新的 TextInputPanel 物件。 除了提供新的可程式性功能之外, TextInputPanel 物件也提供接近 PenInputPanel 物件的所有程式設計功能。 TextInputPanel物件同時包含在 Windows Vista 和 Windows Vista 軟體發展人員套件中。 TextInputPanel物件只與 Windows Vista 輸入面板相容,無法與 Windows XP Service Pack 2 或較舊的輸入面板搭配使用。 先前寫入使用 PenInputPanel 物件的應用程式會繼續使用 Windows Vista 輸入面板,不過,強烈建議撰寫新的平板電腦應用程式開發人員使用新的 TextInputPanel 物件,而不是已取代的 PenInputPanel 物件。
TextInputPanel物件的每個可程式設計選項都可以在每個文字欄位上套用。 這可藉由使用AttachedEditWindow屬性附加TextInputPanel物件的實例來完成。 屬性應該設定為文字欄位的視窗控制碼。
注意
:當輸入面板處於就地互動模式,而不是當輸入面板處於浮動或停駐互動模式時,適用下列幾個屬性和方法。 就地互動模式是輸入面板行為,其中將焦點放在可編輯的欄位中會導致輸入面板圖示出現在欄位旁邊,而點選 [輸入面板] 圖示會導致 [輸入面板] 展開。 只有在輸入面板處於就地互動模式時,才會套用的方法和屬性,全都包含方法或屬性名稱中的 'InPlace'。
輸入面板圖示和輸入面板可見度的控制項
輸入面板的第一個層面,應用程式開發人員在 Windows Vista 中擁有更多控制權是可見度。 使用 TextInputPanel 物件,可以透過三種方式控制In-Place輸入面板的可見度。 使用屬性和方法的組合,應用程式可以判斷In-Place輸入面板顯示時,當In-Place輸入面板顯示時,以及它是否先顯示為輸入面板圖示或立即顯示展開。 藉由結合這些技術來控制可見度,以及下一節所討論控制位置的技術,應用程式開發人員可以使用應用程式中的In-Place輸入面板來建立自訂啟動點和自訂工作流程。
注意
本節中討論的屬性和方法僅適用于輸入面板處於In-Place互動模式時。
首先,基本上,可以將 InPlaceVisibleOnFocus 屬性設定為 false,以防止In-Place輸入面板和輸入面板圖示出現。 將它設定為true會將它還原為可能時出現的系統預設值,前提是使用者或群組原則尚未停用它。 此選項適用于包含自訂文字輸入解決方案作為輸入面板替代方案的應用程式。
其次,藉由設定 DefaultInPlaceState 屬性,開發人員可以指定哪個就地狀態,如 InPlaceState 列舉所指定,當焦點放在文字欄位中時,就會顯示In-Place輸入面板。 系統預設會讓In-Place輸入面板顯示為暫留狀態,除非 [輸入面板] 已在展開狀態中顯示,在此情況下,[輸入面板] 會維持展開狀態。 將 DefaultInPlaceState 屬性設定為 InPlaceState_Expanded 會導致In-Place輸入面板一律顯示展開,而不是先顯示輸入面板圖示,然後要求使用者在 [輸入面板] 展開之前點選 [輸入面板] 圖示。 其他兩個選項是 InPlaceState_Auto,這是系統預設行為, InPlaceState_HoverTarget 一律會導致輸入面板圖示出現。 指定In-Place輸入面板一律會顯示為 TextInputPanel 物件的新功能,而且無法使用 PenInputPanel 物件。 下圖顯示面板的In-Place輸入面板圖示和展開的狀態。
除了能夠控制就地狀態之外,開發人員也可以藉由取得 CurrentInPlaceState 屬性,在指定的時間判斷就地狀態。 當看不到輸入面板時 ,CurrentInPlaceState 等於 DefaultInPlaceState ,除非 當 DefaultInPlaceStateInPlaceState_Auto 在此情況下 ,CurrentInPlaceState 會變成 InPlaceState_HoverTarget。 InPlaceVisibilityChanging / InPlaceVisibilityChanged事件可用來追蹤In-Place輸入面板的可見度狀態。
最後,開發人員可以使用 SetInPlaceVisibility 方法來強制In-Place輸入面板隱藏或顯示。 如果開發人員先前已設定 DefaultInPlaceState 屬性,則強制顯示時,輸入面板會出現在指定的狀態。 只有當焦點目前位於視窗時,才允許應用程式隱藏或顯示In-Place輸入面板,而 TextInputPanel 物件會附加至視窗,而且當使用者未在另一個互動模式中開啟輸入面板時,例如停駐或浮動。 強制In-Place輸入面板隱藏或顯示的能力也是 TextInputPanel 物件的新功能,而且無法使用 PenInputPanel 物件。
這些選項可讓應用程式開發人員更精細地控制In-Place輸入面板何時出現,以及處於何種狀態。 藉由自訂預設就地狀態並控制就地可見度,應用程式開發人員可以在輸入面板回應應用程式設定或使用者輸入應用程式時,建立自訂工作流程。
輸入面板圖示和輸入面板的絕對位置
TextInputPanel物件中可能最吸引人的新功能是In-Place輸入面板的絕對位置。 透過這項新功能,應用程式開發人員可確保In-Place輸入面板不會與應用程式版面配置中的一或多個重要視覺元素重迭。 使用 PenInputPanel 物件,就可以根據位移將In-Place輸入面板相對於文字欄位的位置放置,不過,輸入面板仍會自行調整,以保留在畫面上。 第一次在 Vista 中,應用程式可以使用螢幕座標將In-Place輸入面板放在絕對位置。 此外,將輸入面板保留在畫面上的責任會保留給應用程式開發人員,因此移除輸入面板會自動自動且隨機重新置放的機會。
注意
本節中討論的屬性和方法僅適用于輸入面板處於In-Place互動模式時。
絕對放置In-Place輸入面板所需的兩個主要方法是 SetInPlacePosition 和 SetInPlaceHoverTargetPosition。 第一個是用來指定In-Place輸入面板的位置,第二個是用來指定In-Place輸入面板圖示的位置。 如果應用程式選擇只設定輸入面板圖示位置,而不是In-Place輸入面板的位置,則In-Place輸入面板會出現在系統決定的預設位置。 同樣地,如果應用程式重新置放In-Place輸入面板,而不是輸入面板圖示,則輸入面板圖示會出現在預設位置。 位置是在螢幕座標中指定。 實際定位點是輸入面板圖示或輸入面板的左上角,沒有展開更正組合。 展開校正組合時,放置點不會變更。 (請參閱下圖 2) 沒有限制,其中In-Place輸入面板和In-Place輸入面板圖示可以放置,而且呼叫這些方法的應用程式必須負責將這些方法保留在畫面上。 這兩種方法都是同步的,這表示在方法傳回之前發生位置。 如果輸入面板已在浮動或停駐互動模式中開啟,嘗試放置In-Place輸入面板,或輸入面板圖示In-Place失敗。 此外,如果附加至 TextInputPanel 物件的視窗目前沒有焦點,方法就會失敗。
呼叫 SetInPlacePosition 或 SetInPlaceHoverTargetPosition 不會自動造成In-Place輸入面板或輸入面板圖示顯示,只會在下一次顯示時設定位置。 呼叫 SetInPlaceVisibility 可用來強制他們立即顯示。
在定位In-Place輸入面板時,計算其是否會離開畫面可能有點棘手。 為了簡化此程式, TextInputPanel 物件的數個屬性可用來簡化此程式。 這些屬性和事件可用來判斷所有狀態中In-Place輸入面板的確切大小:
- InPlaceBoundingRectangle – 當目前輸入語言的最大輸入區域顯示時,此屬性會提供In-Place輸入面板的周框。 如果寫入板或字元板決定為最大的輸入區域,則會包含 [插入] 按鈕的高度。 它不包含更正組合的高度。當In-Place輸入面板自動成長時,就會引發 InPlaceSizeChanging / InPlaceSizeChanged事件組,並更新此屬性的值以包含額外的寫入區域或寫入行。
- PopUpCorrectionHeight – 此屬性指定位於輸入面板上方時,插入後更正組合的高度。 若要取得In-Place輸入面板的完整高度,並出現插入後更正組合,請將 InPlaceBoundingRectangle 的高度新增至 PopUpCorrectionHeight。
除了設定In-Place輸入面板和輸入面板圖示的絕對位置,應用程式可以只指定In-Place輸入面板預設會顯示在文字輸入欄位上方或下方。 如此一來,就可以以較鬆散的方式避免應用程式佈建中的重迭元素。 若要這樣做,應用程式會將 PreferredInPlaceDirection 設定為 InPlaceDirection_Bottom 或 InPlaceDirection_Top。 屬性是喜好設定,因為In-Place輸入面板會在必要時覆寫應用程式所設定的喜好設定,以在畫面上保留輸入面板。 系統預設值是盡可能將In-Place輸入面板放在文字欄位下方,否則將其置於上方。 將 PreferredInPlaceDirection 設定為 InPlaceDirection_Auto 還原系統預設值。
將 TextInputPanel物件的屬性、方法和事件結合在一起,讓開發人員能夠對In-Place輸入面板進行必要的控制,以在應用程式版面配置中聰明地放置In-Place輸入面板和輸入面板圖示,因此它們不會中斷版面配置流程,在某些情況下可能會出現整合。 這個新層級的控制是平板電腦應用程式設計的大型勝出。
存取三個輸入面板區域:寫入板、字元板和鍵盤
輸入面板有三個輸入區域:[寫入板]、[字元板] 和 [鍵盤]。 使用 TextInputPanel 物件,應用程式可以在輸入面板開啟時指定向使用者顯示的預設輸入區域。 應用程式這麼做的主要原因是將輸入區域與特定欄位的輸入類型配對。 例如,Writing Pad 可能最適合填寫批註欄位,但鍵盤可能更方便輸入包含數位和字母的產品序號。 若要指定預設輸入區域,應用程式會將DefaultInputArea 屬性設定為 PanelInputArea列舉所定義的三個輸入區域之一。 下圖顯示三個輸入區域。
系統預設輸入區域是英文、法文、德文、西班牙文、義大利文、葡萄牙文、荷蘭文和其他所有拉丁輸入語言的 Writing Pad。 針對東亞輸入語言,包括日文、中文和韓文,預設輸入區域為 Character Pad。 不過,當使用者變更輸入區域時,它會覆寫目前輸入語言的預設輸入區域,並儲存為該輸入語言的新預設值。 鍵盤是密碼欄位的預設輸入區域,不論輸入語言為何,除非使用者或群組原則已停用密碼安全性。 在所有情況下,設定預設輸入面板區域會以程式設計方式覆寫系統預設值,除非目前的欄位是密碼欄位,或目前輸入語言的手寫辨識器不支援以程式設計方式選取的輸入區域。 將 DefaultInputArea 屬性設定為 InPlaceDirection_Auto 還原系統預設設定。
不論預設輸入面板區域是否已以程式設計方式設定,使用者都可以選擇在開啟輸入面板後變更目前的輸入面板區域。 在使用者變更目前的輸入區域之後,使用者選取專案會持續存在,直到 [輸入面板] 關閉或使用者再次變更選取範圍為止。 在 [輸入面板] 關閉並重新開啟之後,以程式設計方式設定預設輸入區域會重新顯示。
由於目前的輸入面板區域可能與預設輸入面板區域不同,因此應用程式可以查詢 CurrentInputArea 屬性來判斷目前可見的輸入區域。 如果目前看不到輸入面板,則目前的輸入區域等於預設輸入區域。 CurrentInputArea屬性絕不等於PanelInputArea_Auto。 如果 DefaultInputArea 等於 PanelInputArea_Auto,則 CurrentInputArea 等於顯示的最後一個輸入區域,如果從未顯示輸入面板,則為目前輸入語言的系統預設值。
在 PenInputPanel物件中找到的輸入區域支援與TextInputPanel物件的主要差異在於,除了 Writing Pad 和 Keyboard 之外,應用程式現在可以選擇將預設輸入區域設定為 Character Pad。
使用上述屬性,應用程式可以控制不同欄位中顯示的輸入面板輸入區域,並將使用者的文字輸入體驗優化。 此外,應用程式可以維持對目前輸入區域的認知,並根據最適合目前使用者工作的輸入區域做出條件式決策。
輸入面板互動模式的詳細資訊
除了能夠偵測輸入面板目前的輸入區域,也可以偵測目前的互動模式:就地、停駐或浮動。 應用程式可能必須知道目前的互動模式,以瞭解使用者與應用程式互動的方式,或因為 TextInputPanel 物件的某些方法和屬性僅適用于In-Place互動模式。 例如,在應用程式中,重排現有的使用者介面元素,然後將In-Place輸入面板放在其使用者介面的空白區域上,應該先檢查以確定目前的互動模式已就地進行調整。
TextInputPanel物件的CurrentInteractionMode屬性會儲存使用者所選擇的目前互動模式。 可能的模式是由 InteractionMode 列舉所定義,如下所示:
InteractionMode_InPlace – 在 [In-Place互動模式輸入面板] 中,會出現在目前有焦點的文字輸入欄位旁邊。 根據預設,當插入點放在文字輸入欄位中時,就會顯示In-Place輸入面板圖示。 點選 [輸入面板] 圖示會導致輸入面板展開。 只有在插入點位於可編輯的欄位中時,才會看到In-Place輸入面板。
InteractionMode_Floating – 浮動互動模式類似于 InPlace 互動模式,但不會系結至插入點。 點選 [輸入面板] 索引標籤,依預設會出現在畫面左邊緣,開啟浮動輸入面板。 使用者可以拖曳和重新置放 [浮動輸入面板] 和 [輸入面板] 索引標籤。 在輸入面板的浮動模式位置和控制項中,完全會保留給使用者。
InteractionMode_DockedTop – 在 [Docked-Top互動模式輸入面板] 會出現在畫面頂端,並調整使用中桌面的大小,因此輸入面板不會與任何其他視窗或 UI 元素重迭。 在停駐模式中,無法拖曳或移動輸入面板。
InteractionMode_DockedBottom – Docked-Bottom互動模式與Docked-Top模式相同,但輸入面板會顯示在畫面底部。
當看不到 [輸入面板] 時,目前的互動模式為 [就地]。
發佈目前的互動模型是 TextInputPanel 物件提供輸入面板狀態的詳細資訊,比任何舊版中可用的還要多。
輸入面板更正模式的詳細資訊
TextInputPanel物件提供與 控制的詳細資訊,輸入面板的最後一個層面是更正模式。 瞭解更正模式可協助應用程式判斷輸入面板目前的大小。 控制應用程式中的插入後更正擴充方式,是自訂應用程式中更正體驗的一種方式。
修正組合可以出現在下列兩種基本模式:預先插入和插入後。 插入前修正組合是用來在將文字插入應用程式之前更正文字。 它會藉由點選在 Writing Pad 中以使用者筆跡方式出現在基準下方的暫止文字來啟用。 插入後修正組合用於在插入應用程式之後更正文字。 它會藉由將插入點放在 或選取先前插入的文字中來啟動。 除了這兩種基本模式之外,插入後修正組合如何出現數種變化。 首先,它可以出現在輸入面板上方或下方,第二個會顯示折迭或展開。 在折迭狀態中,[插入後更正組合] 只會顯示替代專案清單。 在展開狀態中,它同時包含替代專案和重新撰寫文字的區域。
CurrentCorrectionMode屬性可讓應用程式判斷更正組合的目前組態。CorrectionMode列舉所定義的此屬性可能值為:NotVisible、PreInsertion、PostInsertionCollapsed和PostInsertionExpanded。 當看不到任何輸入面板或更正組合時, CurrentCorrectionMode 為 NotVisible。
根據預設,系統會在選取可更正的文字時顯示展開的插入後修正組合,並在插入點置於可更正的文字時折迭。 應用程式可以藉由將 ExpandPostInsertionCorrection 屬性設定為 true,來指定 [插入後更正組合] 應該一律顯示展開的位置。 系統預設值為 false。 當 ExpandPostInsertionCorrection 屬性與 IHandWrittenTextInsertion 介面搭配使用時,應用程式開發人員可以便宜地將更正支援新增至不會自動取得的應用程式。
追蹤和控制輸入面板的更正狀態,是 TextInputPanel 物件的許多新功能之一,可讓輸入面板和應用程式整合更緊密。
事件發生前後的事件通知
在 TextInputPanel物件中大幅改善的輸入面板程式性另一個層面是事件模型。 現在,不要只引發事件,而是在發生變更之後收到輸入面板狀態變更的訊號,而是在發生變更之前和之後傳送不同的事件。 發出事件開頭訊號的事件包含現成的時態動詞,例如「變更」或「插入」,而事件表示事件結論的事件包含過去時態動詞,例如「已變更」或「插入」。
此事件模型可讓應用程式在變更發生之前或發生時回應。 輸入面板會遭到封鎖,而無法繼續進行變更或繼續,直到所有事件的事件處理常式完成為止。 這些事件是同步的,如此一來,應用程式就可以延遲變更,直到它完成回應為止。 不過,事件處理常式執行輸入面板的時間對使用者而言變得無法存取,而且可能會無回應,因此事件處理常式的執行效能很重要。 不過,應用程式無法防止或取消事件。 所有事件參數都是唯讀的。 以下是 TextInputPanel 物件的六個事件組的描述:
- InPlaceStateChanging / InPlaceStateChanged – 通知就地狀態即將開啟或剛從暫留切換為展開,反之亦然。 參數是新的和舊的就地狀態。 與 CurrentInPlaceState 屬性值的變更一致。
- InPlaceSizeChanging / InPlaceSizeChanged - 指出In-Place輸入面板大小即將變更或因使用者調整大小、自動成長或輸入區域變更而變更。 參數是新的和舊的周框。 與 InPlaceBoundingRectangle 屬性的值變更一致。
- InputAreaChanging / InputAreaChanged – 當輸入面板輸入區域即將變更或從變更為三個可能輸入區域的其他區域時報告:Writing Pad、Character Pad 或 Keyboard。 參數是新的和舊的輸入區域。 符合 CurrentInputArea 屬性值的變更
- CorrectionModeChanging / CorrectionModeChanged – 修正模式即將變更或已變更的通知。 可能的修正模式包括:不可見、插入前、插入後折迭,以及插入後展開。 參數是新的和舊的更正模式。 符合 CurrentCorrectionMode 屬性值的變更。
- InPlaceVisibilityChanging / InPlaceVisibilityChanged – 指出In-Place輸入面板可見度即將變更或變更的時機。 參數是新的和舊的可見度。 false的新可見度表示In-Place輸入面板未開啟,但不會排除在浮動或停駐互動模式中可見的輸入面板。
- TextInserting / TextInserted – 指出文字即將插入或已從輸入面板插入。 Parameter 是 InkDisp 物件的陣列,每個物件都包含組成插入的一行筆跡和文字。 在下一節中深入瞭解此事件。
這些事件會為應用程式提供輸入面板中變更的重要資訊,並讓他們據以回應。 同樣地,輸入面板事件模型中的變更代表應用程式與輸入面板之間更佳互動的步驟。
支援收集輸入面板中輸入的筆跡和文字
最後,當然不至少是 TextInputPanel 物件的一項非常強大的新功能,就是能夠在文字插入應用程式時,從輸入面板取得透過輸入面板輸入的文字筆跡物件。 這通常是為了變更追蹤和記錄保留而要求的功能。 它也可讓應用程式使用其 UI 中的筆跡做為靜態元素或自訂筆跡介面。
若要接收透過輸入面板輸入之文字的InkDisp物件,應用程式必須註冊才能接收TextInserting 或 TextInserted事件所產生的TextInputPanel物件。 TextInserting事件會在文字從輸入面板插入應用程式之前立即引發,而且在所有事件處理常式完成之前都不會插入文字。 插入測試之後, TextInserted 事件會立即引發。 TextInserting和TextInserted事件的唯一參數是InkDisp物件的陣列,其中包含從輸入面板插入之每一行文字的InkDisp物件。 注意:當事件處理常式執行時,輸入面板處於非作用中狀態,而且可能會對使用者顯示無回應,因此請務必讓這些事件處理常式輕量且確定其快速執行。 此外,應用程式不應該為此事件建立處理常式,除非它有特定的資訊用途,因為有與這麼做相關聯的效能成本。 輸入面板只會在有應用程式要求資料時封送處理筆跡資料,否則輸入面板可以略過此昂貴的作業。 TextInserting和TextInserted事件的參數都是唯讀的,這表示應用程式無法在插入應用程式之前變更插入的文字。
應用程式可以運用這項新功能的可能性很廣泛,而且使用方式可能比較簡單。 允許透過輸入面板輸入的可辨識文字和筆跡由應用程式收集,只是 Windows Vista 中輸入面板開發人員故事的另一種方式。
結論
整體來說,平板電腦輸入面板的程式設計性案例在 Windows Vista 中引進 TextInputPanel 物件已大幅改善。 藉由使用 TextInputPanel 物件,應用程式開發人員在舊版中擁有更多狀態輸入面板的控制權和詳細資訊。 因此,建置新平板電腦應用程式或更新現有應用程式的應用程式開發人員強烈建議使用 TextInputPanel 物件,而不是現在已被取代的 PenInputPanel 物件。 此外,支援新的功能,例如輸入面板和輸入面板圖示的絕對位置,以及應用程式接收透過輸入面板輸入的辨識器文字和筆跡的能力,可啟用新的應用程式功能和案例。 這些功能和數個其他功能都直接回應開發人員意見反應,並標示第一個步驟,以完整整合輸入面板與平板電腦應用程式。 最後,擴充平板電腦應用程式功能是應用程式開發人員和平板電腦平臺的一大成功。