Condividi tramite


Esempio di riconoscimento avanzato

L'esempio di riconoscimento avanzato illustra le funzionalità avanzate dell'API (Application Programming Interface) di Automazione PC Tablet Microsoft usata per il riconoscimento della grafia.

Include le funzionalità seguenti:

  • Enumerazione del sistema di riconoscimento installato
  • Creazione di un contesto di riconoscimento con un linguaggio specifico
  • Uso dell'oggetto riconoscitore
  • Impostazione dei factoid di riconoscimento e degli elenchi di parole
  • Uso delle guide per migliorare la qualità del riconoscimento
  • Riconoscimento dello sfondo dinamico
  • Riconoscimento dei movimenti

Le interfacce usate sono: IInkRecognizer, IInkRecoContext, IInkRecognitionResult, IInkRecognitionGuide, IInkWordList, IInkGesture, IInkCollector, IInkDisp, IInkRenderer, IInkDrawingAttributes, IInkStrokese IInkStroke.

Intestazioni Ink e progetto

In primo luogo, includere le intestazioni per le interfacce di automazione per PC tablet. Questi vengono installati con Tablet PC Platform SDK. Il file TpcError.h contiene le definizioni del codice di errore dell'API Tablet PC.

#include <msinkaut.h>
#include <msinkaut_i.c>
#include <TpcError.h>

Il file EventSinks.h definisce le interfacce IInkEventsImpl e IInkRecognitionEventsImpl e configura gli eventi RecognitionWithAlternates, Strokee Gesture.

#include "EventSinks.h"

Il file ChildWnds.h contiene le definizioni delle classi CInkInputWnd e CRecoOutputWnd, derivate da CWindowImpl di ATL e usate per la creazione delle finestre figlio dell'esempio.

#include "ChildWnds.h"

Il file AdvReco.h dichiara la classe CAdvRecoApp, ovvero la classe della finestra dell'applicazione per questo esempio.

#include "AdvReco.h"

Inizializzazione della finestra dell'applicazione

Il metodo di Run della finestra configura l'oggetto CAdvRecoApp, carica il menu e l'icona per la finestra, crea un oggetto InkRecognizerContext per il riconoscitore predefinito e avvia il ciclo di messaggi della finestra.

Il metodo OnCreate della finestra gestisce l'evento WM_CREATE e crea le finestre figlio. Un oggetto InkCollector si connette all'origine degli eventi del raccoglitore di inchiostro e abilita l'input penna nella finestra di immissione. Crea quindi un oggetto InkRecognizerGuide e utilizza la proprietà Renderer del raccoglitore di inchiostro per convertire i rettangoli della casella della guida di riconoscimento nello spazio di inchiostro. Infine, il metodo OnCreate crea un oggetto InkWordList.

Gestione degli eventi del raccoglitore di inchiostro

Il metodo OnStroke della finestra gestisce l'evento Stroke del raccoglitore di inchiostro. Il nuovo oggetto IInkStrokeDisp viene aggiunto al inkStrokes della proprietàdell'agente di raccolta input penna.

Il metodo della finestra gestisce l'evento dell'agente di raccolta input penna. Il metodo OnGesture identifica il movimento, usando prima il movimento di attendibilità più alto e verifica se la finestra supporta questo particolare movimento. Se il movimento è supportato, il rettangolo di delimitazione del movimento viene invalidato, perché il movimento viene rimosso dalla raccolta di tratti. Se il movimento non è supportato, l'evento Gesture viene annullato, che fa sì che il raccoglitore di inchiostro generi un evento Stroke. Infine, la finestra dei risultati viene aggiornata.

Gestione degli eventi di contesto del riconoscitore

Il metodo OnRecognitionWithAlternates della finestra gestisce l'evento RecognitionWithAlternates del contesto di riconoscimento. Il metodo OnRecognitionWithAlternates visualizza i risultati del riconoscimento nella finestra dei risultati.

Gestione dei comandi di menu

Il metodo OnRecognizer della finestra gestisce i comandi nel menu Recognizer. Se è stato selezionato il comando predefinito, viene usato il metodo GetDefaultRecognizer del InkRecognizers per recuperare il riconoscitore predefinito; in caso contrario, viene recuperato il riconoscitore selezionato. Viene quindi creato e usato un contesto di riconoscimento e viene aggiornata la barra di stato e menu.

Il metodo OnFactoidWordlist della finestra gestisce il comando Use Wordlist nel menu Factoid. La proprietà Strokes del contesto di riconoscimento è impostata su NULL per reimpostare il contesto di riconoscimento. Se l'opzione Usa WordList è disattivata, la proprietà WordList del contesto di riconoscimento è impostata su NULL; in caso contrario, la proprietà WordList del contesto di riconoscimento viene impostata sul InkWordList creato nel metodo OnCreate. Infine, il InkStrokes del raccoglitore di inchiostro viene riattaccato al contesto del riconoscitore, e il metodo BackgroundRecognizeWithAlternates del contesto del riconoscimento viene chiamato, e il menu viene aggiornato.

Il metodo OnFactoid della finestra gestisce i comandi factoid del menu Factoid. Imposta innanzitutto la proprietà Strokes del contesto di riconoscimento su NULL, imposta la proprietà Factoid del contesto di riconoscimento sul factoid selezionato e riassegna i InkStrokes del raccoglitore di inchiostro al contesto di riconoscimento. Se l'oggetto Factoid è supportato dal contesto del riconoscitore, viene chiamato il metodo BackgroundRecognizeWithAlternates del contesto di riconoscimento; in caso contrario, viene visualizzato un messaggio di errore. Infine, vengono aggiornati il menu e la barra di stato.

Il metodo OnGuide della finestra gestisce i comandi nel menu Guida. Se il contesto di riconoscimento supporta le opzioni della guida, il metodo OnGuide imposta la proprietà Strokes del contesto di riconoscimento su NULL, imposta la proprietà Guide del contesto di riconoscimento sull'impostazione della guida scelta, riassegna le InkStrokes del raccoglitore di inchiostro al contesto di riconoscimento e chiama il metodo BackgroundRecognizeWithAlternates del contesto del riconoscitore. In caso contrario, viene visualizzato un messaggio di errore. Infine, vengono aggiornate la finestra di input, il menu e la barra di stato.

Il metodo OnMode della finestra gestisce i comandi nel menu Mode. Disabilita il collettore di inchiostro, aggiorna la proprietà CollectionMode del collettore di inchiostro, aggiorna il menu e mostra o nasconde gli elenchi dei gesti. Infine, il raccoglitore di inchiostro è attivato.

Il metodo OnRecognize della finestra gestisce il comando Recognize nel menu Inchiostro. Chiama il metodo EndInkInput del contesto di riconoscimento per impedire che l'input penna venga aggiunto al contesto di riconoscimento. Questo è talvolta necessario, perché non tutti i riconoscitori supportano il riconoscimento parziale. Chiama quindi il metodo Recognize del contesto del riconoscitore e passa i risultati al metodo OnRecognitionWithAlternates della finestra. Infine, il InkStrokes del collettore d'inchiostro viene riassegnato al contesto del riconoscimento.

Il metodo OnClear della finestra gestisce il comando Clear nel menu inchiostro. Elimina i tratti dalla proprietà Ink del collettore di inchiostro, rilascia la vecchia raccolta di tratti e ne crea una nuova per la proprietà Ink del collettore di inchiostro, quindi collega la nuova raccolta di tratti al contesto del riconoscitore.

Il metodo OnExit della finestra gestisce il comando Exit nel menu Ink e genera l'evento WM_CLOSE.

Metodi di supporto

Il metodo LoadMenu della finestra viene chiamato dal metodo Run della finestra e aggiunge l'elenco dei riconoscitori supportati e l'elenco dei factoid supportati al menu. Prima di tutto, recupera il InkRecognizers. Esegue quindi l'iterazione dei riconoscitori disponibili e seleziona solo quelli che hanno un elenco di lingue nella proprietà lingue, che aggiunge al menu Recognizer. Infine, popola il factoid menu con l'elenco dei factoid definiti come una costante globale.

Il metodo UseRecognizer della finestra viene chiamato dal metodo OnRecognizer della finestra quando l'utente seleziona un nuovo riconoscitore. Crea un contesto di riconoscimento, scollega il contesto precedente dal sink dell'evento di riconoscimento, cancella e rilascia il contesto precedente e collega il nuovo contesto al sink dell'evento di riconoscimento.

Il metodo UseRecognizer verifica quindi la proprietà Capabilities del riconoscitore, che restituisce un valore InkRecognizerCapabilities. Se il riconoscitore supporta l'input su riga, il comando Righe nel menu Guida è abilitato. Se il sistema di riconoscimento supporta l'input boxed, il comando Boxes è abilitato. Se il sistema di riconoscimento non supporta l'input gratuito, il comando Nessuna è disabilitato. Se la selezione della guida corrente non è supportata, sia la proprietà Guida del contesto del sistema di riconoscimento sia il menu vengono aggiornati.

Il metodo UseRecognizer tenta quindi di impostare le proprietà WordList e Factoid del contesto di riconoscimento. Se una delle due impostazioni non è supportata dal riconoscitore, viene usato il valore predefinito e il menu viene aggiornato.

Infine, il metodo UseRecognizer allega la proprietà Strokes dell'oggetto InkDisp del raccoglitore di inchiostro al contesto del riconoscitore, modifica il tipo di carattere della finestra di output in uno supportato dalla lingua del riconoscitore, reimposta la finestra di output e aggiorna i risultati del riconoscimento chiamando il metodo BackgroundRecognizeWithAlternates del contesto del riconoscitore.

Il metodo GetGestureName della finestra viene chiamato dal metodo OnGesture della finestra. Cerca il movimento e restituisce un indice al nome del movimento, archiviato in una tabella di stringhe nel file AdvReco.rc.