進階辨識範例
進階辨識範例示範 Microsoft 平板電腦自動化應用程式開發介面的進階功能, (API) 用於手寫辨識。
其中包含下列功能:
- 列舉已安裝的辨識器
- 使用特定語言建立辨識器內容
- 使用辨識器物件
- 設定辨識事實和字組清單
- 使用指南來改善辨識品質
- 動態背景辨識
- 手勢辨識
所使用的介面包括: IInkRecognizer、 IInkRecoCoNtext、 IInkRecognitionResult、 IInkRecognitionGuide、 IInkWordList、 IInkGesture、 IInkCollector、 IInkDisp、 IInkRenderer、 IInkDrawingAttributes、 IInkStrokes和 IInkStroke。
筆跡和專案標頭
首先,包含平板電腦自動化介面的標頭。 這些是隨平板電腦平臺 SDK 一起安裝。 TpcError.h 檔案包含平板電腦 API 錯誤碼定義。
#include <msinkaut.h>
#include <msinkaut_i.c>
#include <TpcError.h>
EventSinks.h 檔案會定義 IInkEventsImpl 和 IInkRecognitionEventsImpl 介面,並設定 RecognitionWithAlternates、 Stroke和 Gesture 事件。
#include "EventSinks.h"
ChildWnds.h 檔案包含 CInkInputWnd 和 CRecoOutputWnd類別的定義,這些類別衍生自 ATL 的 CWindowImpl,並用於建立範例的子視窗。
#include "ChildWnds.h"
AdvReco.h 檔案會宣告 CAdvRecoApp 類別,這是此範例的應用程式視窗類別。
#include "AdvReco.h"
初始化應用程式視窗
視窗的 Run
方法會設定 CAdvRecoApp 物件、載入視窗的功能表和圖示、建立預設辨識器的 InkRecognizerCoNtext 物件,以及啟動視窗的訊息迴圈。
視窗的 OnCreate 方法會處理 WM_CREATE 事件,並建立子視窗。 InkCollector物件會連接到筆跡收集器的事件來源,並在輸入視窗上啟用筆跡輸入。 然後它會建立 InkRecognizerGuide 物件,並使用筆跡收集器的 Renderer 屬性,將辨識參考方塊矩形轉換為筆跡空間。 最後, OnCreate 方法會建立 InkWordList 物件。
處理筆跡收集器事件
視窗的 OnStroke 方法會處理筆跡收集器的 Stroke 事件。 新的IInkStrokeDisp物件會新增至筆跡收集器 Ink 屬性的InkStrokes。
視窗的 OnGesture 方法會處理筆跡收集器的 Gesture 事件。 OnGesture方法會先使用最高信賴手勢識別手勢,並檢查視窗是否支援這個特定手勢。 如果支援筆勢,則手勢的周框方塊會失效,因為手勢會從筆劃集合中移除。 如果不支援筆 勢,則會取消 Gesture 事件,這會導致筆跡收集器引發 Stroke 事件。 最後,結果視窗會更新。
處理辨識器內容事件
視窗的 OnRecognitionWithAlternates 方法會 處理辨識器內容的 RecognitionWithAlternates 事件。 OnRecognitionWithAlternates方法會在結果視窗中顯示辨識結果。
處理功能表命令
視窗的 OnRecognizer 方法會處理 [辨識器] 功能表上的命令。 如果已選取Default命令,InkRecognizers的GetDefaultRecognizer方法會用來擷取預設辨識器;否則,會擷取選取的辨識器。 然後,會建立及使用辨識器內容,並更新功能表和狀態列。
視窗的OnFactoidWordlist方法會處理Factoid功能表上的 [使用 Wordlist] 命令。 辨識器內容的 Strokes 屬性設定為 Null ,以重設辨識器內容。 如果關閉[使用 Wordlist] 選項,辨識器內容的WordList屬性會設定為Null;否則,辨識器內容的WordList屬性會設定為OnCreate方法中建立的InkWordList。 最後,會重新附加筆跡收集器的 InkStrokes 至辨識器內容、呼叫辨識器內容的 BackgroundRecognizeWithAlternates 方法,並更新功能表。
視窗的 OnFactoid 方法會處理 Factoid 功能表上的 factoid 命令。 它會先將辨識器內容的 Strokes 屬性設定為 Null、將辨識器內容的 Factoid 屬性設定為選取的 Factoid ,然後將筆跡收集器的 InkStrokes 重新指派給辨識器內容。 如果辨識器內容支援 Factoid 物件,則會呼叫辨識器內容的 BackgroundRecognizeWithAlternates 方法;否則會顯示錯誤訊息。 最後,功能表和狀態列會更新。
視窗的 OnGuide 方法會處理 [指南 ] 功能表上的命令。 如果辨識器內容支援指南選項, OnGuide 方法會將辨識器內容的 Strokes 屬性設定為 Null、將辨識器內容的 Guide 屬性設定為選取的指南設定、將筆跡收集器的 InkStrokes 重新指派給辨識器內容,並呼叫辨識器內容的 BackgroundRecognizeWithAlternates 方法。 否則,會顯示錯誤訊息。 最後,會更新輸入視窗、功能表和狀態列。
視窗的 OnMode 方法會處理 [模式 ] 功能表上的命令。 它會停用筆跡收集器、更新筆跡收集器的 CollectionMode 屬性、更新功能表,以及顯示或隱藏手勢清單。 最後,會啟用筆跡收集器。
視窗的 OnRecognize 方法會處理 Ink 功能表上的 Recognize 命令。 它會呼叫辨識器內容的 EndInkInput 方法,讓筆跡無法新增至辨識器內容。 這有時是必要的,因為並非所有辨識器都支援部分辨識。 然後它會呼叫辨識器內容的 Recognize 方法,並將結果傳遞至視窗的 OnRecognitionWithAlternates 方法。 最後, 筆跡收集器的 InkStrokes 會重新指派給辨識器內容。
視窗的OnClear方法會處理Ink功能表上的Clear命令。 它會從筆跡收集器的 Ink 屬性刪除筆劃、釋放舊的筆劃集合,並為筆跡收集器的 Ink 屬性建立新的筆劃,並將新的筆劃集合附加至辨識器內容。
視窗的OnExit方法會處理Ink功能表上的Exit命令,並引發 WM_CLOSE 事件。
Helper 方法
視窗的 LoadMenu 方法是從視窗的 Run 方法呼叫,並將支援的辨識器和支援的事實清單新增至功能表。 首先,它會擷取 InkRecognizers。 然後逐一查看可用的辨識器,並只選取 [ 語言 ] 屬性中具有語言清單的辨識器,它會新增至 [辨識器 ] 功能表。 最後,它會將定義為全域常數的 Factoid 清單填入 Factoid 功能表。
當使用者選取新的辨識器時,會從視窗的OnRecognizer方法呼叫視窗的UseRecognizer方法。 它會建立辨識器內容、中斷辨識器事件接收的舊內容、清除和釋放舊內容,並將新內容附加至辨識器事件接收。
然後, UseRecognizer 方法會檢查辨識器的 Capabilities 屬性,這會傳回 InkRecognizerCapabilities 值。 如果辨識器支援線條輸入,則會啟用[指南] 功能表上的 [行] 命令。 如果辨識器支援 Boxed 輸入, 則會啟用 Box 命令。 如果辨識器不支援免費輸入, 則會停用 None 命令。 如果不支援目前的指南選取範圍,則會更新辨識器內容和功能表的 Guide 屬性。
然後, UseRecognizer 方法會嘗試設定辨識器內容的 WordList 和 Factoid 屬性。 如果辨識器不支援任一設定,則會使用預設值並更新功能表。
最後,UseRecognizer方法會將筆跡收集器InkDisp物件的Strokes屬性附加至辨識器內容、將輸出視窗的字型變更為辨識器語言所支援的字型、重設輸出視窗,以及呼叫辨識器內容的BackgroundRecognizeWithAlternates方法來更新辨識結果。
視窗的 GetGestureName 方法是從視窗的 OnGesture 方法呼叫。 它會搜尋手勢,並傳回筆勢名稱的索引,該名稱會儲存在 AdvReco.rc 檔案中的字串資料表中。