Ejemplo de reconocimiento avanzado
En el ejemplo de reconocimiento avanzado se muestran las características avanzadas de la interfaz de programación de aplicaciones (API) de Automatización de pc tableta de Microsoft que se usa para el reconocimiento de escritura a mano.
Contiene las características siguientes:
- Enumeración del reconocedor instalado
- Creación de un contexto de reconocedor con un lenguaje específico
- Uso del objeto recognizer
- Establecimiento de listas de palabras y factoid de reconocimiento
- Uso de guías para mejorar la calidad del reconocimiento
- Reconocimiento dinámico de fondo
- Reconocimiento de gestos
Las interfaces usadas son: IInkRecognizer, IInkRecoContext, IInkRecognitionResult, IInkRecognitionGuide, IInkWordList, IInkGesture, IInkCollector, IInkDisp, IInkRenderer, IInkDrawingAttributes, IInkStrokes e IInkStroke.
Encabezados de entrada de lápiz y proyecto
En primer lugar, incluya los encabezados de las interfaces de automatización de PC tableta. Estos se instalan con el SDK de plataforma de tablet PC. El archivo TpcError.h contiene las definiciones de código de error de la API de Tablet PC.
#include <msinkaut.h>
#include <msinkaut_i.c>
#include <TpcError.h>
El archivo EventSinks.h define las interfaces IInkEventsImpl e IInkRecognitionEventsImpl y configura los eventos RecognitionWithAlternates, Stroke y Gesture .
#include "EventSinks.h"
El archivo ChildWnds.h contiene las definiciones de las clases CInkInputWnd y CRecoOutputWnd, que se derivan del CWindowImpl de ATL y se usan para crear las ventanas secundarias del ejemplo.
#include "ChildWnds.h"
El archivo AdvReco.h declara la clase CAdvRecoApp , que es la clase de ventana de aplicación de este ejemplo.
#include "AdvReco.h"
Inicialización de la ventana aplicación
El método de Run
la ventana configura el objeto CAdvRecoApp , carga el menú y el icono de la ventana, crea un objeto InkRecognizerContext para el reconocedor predeterminado e inicia el bucle de mensajes de la ventana.
El método OnCreate de la ventana controla el evento WM_CREATE y crea las ventanas secundarias. Un objeto InkCollector se conecta al origen de eventos del recopilador de tinta y habilita la entrada de lápiz en la ventana de entrada. A continuación, crea un objeto InkRecognizerGuide y usa la propiedad Renderer del recopilador de tinta para convertir los rectángulos del cuadro de guía de reconocimiento al espacio de entrada de lápiz. Por último, el método OnCreate crea un objeto InkWordList .
Controlar eventos del recopilador de lápiz
El método OnStroke de la ventana controla el evento Stroke del recopilador de tintas. El nuevo objeto IInkStrokeDisp se agrega a los InkStrokes de la propiedad Ink del recopilador de tintas.
El método OnGesture de la ventana controla el evento Gesture del recopilador de tinta. El método OnGesture identifica el gesto, utilizando primero el gesto de mayor confianza y comprueba si la ventana admite este gesto en particular. Si se admite el gesto, el cuadro de límite del gesto se invalida, ya que el gesto se quita de la colección de trazos. Si no se admite el gesto, se cancela el evento Gesture , lo que hace que el recopilador de tinta genere un evento Stroke . Por último, se actualiza la ventana de resultados.
Controlar eventos de contexto del reconocedor
El método OnRecognitionWithAlternates de la ventana controla el evento RecognitionWithAlternates del contexto del reconocedor. El método OnRecognitionWithAlternates muestra los resultados de reconocimiento en la ventana de resultados.
Comandos de menú de control
El método OnRecognizer de la ventana controla los comandos del menú Recognizer. Si se seleccionó el comando Default , se usa el método GetDefaultRecognizer de InkRecognizers para recuperar el reconocedor predeterminado; de lo contrario, se recupera el reconocedor seleccionado. A continuación, se crea y usa un contexto de reconocedor, y se actualizan el menú y la barra de estado.
El método OnFactoidWordlist de la ventana controla el comando Usar Wordlist en el menú Factoid . La propiedad Strokes del contexto del reconocedor se establece en NULL para restablecer el contexto del reconocedor. Si la opción Usar Wordlist está desactivada, la propiedad WordList del contexto del reconocedor se establece en NULL; de lo contrario, la propiedad WordList del contexto del reconocedor se establece en inkWordList que se creó en el método OnCreate . Por último, los InkStrokes del recopilador de tintas se vuelven a adjuntar al contexto del reconocedor, se llama al método BackgroundRecognizeWithAlternates del contexto del reconocedor y se actualiza el menú.
El método OnFactoid de la ventana controla los comandos factoid del menú Factoid . Primero establece la propiedad Strokes del contexto de reconocedor en NULL, establece la propiedad Factoid del contexto del reconocedor en el factoid seleccionado y reasigna las inkStrokes del recopilador de tinta al contexto del reconocedor. Si el contexto del reconocedor admite el objeto Factoid , se llama al método BackgroundRecognizeWithAlternates del contexto del reconocedor; de lo contrario, se muestra un mensaje de error. Por último, se actualizan el menú y la barra de estado.
El método OnGuide de la ventana controla los comandos del menú Guía . Si el contexto del reconocedor admite las opciones de guía, el método OnGuide establece la propiedad Strokes del contexto del reconocedor en NULL, establece la propiedad Guide del contexto del reconocedor en la configuración de la guía seleccionada, reasigna los InkStrokes del recopilador de tinta al contexto del reconocedor y llama al método BackgroundRecognizeWithAlternates del contexto del reconocedor. De lo contrario, se muestra un mensaje de error. Por último, se actualizan la ventana de entrada, el menú y la barra de estado.
El método OnMode de la ventana controla los comandos en el menú Modo . Deshabilita el recopilador de tintas, actualiza la propiedad CollectionMode del recopilador de lápiz, actualiza el menú y muestra u oculta las listas de gestos. Por último, el recopilador de tintas está habilitado.
El método OnRecognize de la ventana controla el comando Recognize en el menú Entrada de lápiz. Llama al método EndInkInput del contexto del reconocedor para evitar que la entrada de lápiz se agregue al contexto del reconocedor. Esto a veces es necesario, ya que no todos los reconocedores admiten el reconocimiento parcial. A continuación, llama al método Recognize del contexto del reconocedor y pasa los resultados al método OnRecognitionWithAlternates de la ventana. Por último, inkStrokes del recopilador de tintas se reasigna al contexto del reconocedor.
El método OnClear de la ventana controla el comando Borrar en el menú Entrada de lápiz . Elimina los trazos de la propiedad Ink del recopilador de tinta, libera la colección de trazos antiguos y crea una nueva para la propiedad Ink del recopilador de tinta y adjunta la nueva colección strokes al contexto del reconocedor.
El método OnExit de la ventana controla el comando Exit en el menú Entrada de lápiz y genera el evento WM_CLOSE.
métodos del asistente
Se llama al método LoadMenu de la ventana desde el método Run de la ventana y agrega la lista de reconocedores admitidos y la lista de factoids admitidos al menú. En primer lugar, recupera los InkRecognizers. A continuación, recorre en iteración los reconocedores disponibles y solo selecciona los que tienen una lista de idiomas en la propiedad Languages , que agrega al menú Recognizer . Por último, rellena el menú Factoid con la lista de factoides definidos como una constante global.
Se llama al método UseRecognizer de la ventana desde el método OnRecognizer de la ventana cuando el usuario selecciona un nuevo reconocedor. Crea un contexto de reconocedor, separa el contexto anterior del receptor de eventos del reconocedor, borra y libera el contexto anterior y adjunta el nuevo contexto al receptor de eventos del reconocedor.
A continuación, el método UseRecognizer comprueba la propiedad Capabilities del reconocedor, que devuelve un valor InkRecognizerCapabilities . Si el reconocedor admite entradas alineadas, el comando Líneas del menú Guía está habilitado. Si el reconocedor admite la entrada boxed, el comando Boxes está habilitado. Si el reconocedor no admite entradas gratuitas, el comando None está deshabilitado. Si no se admite la selección de guía actual, se actualizan la propiedad Guide del contexto del reconocedor y el menú.
A continuación, el método UseRecognizer intenta establecer las propiedades WordList y Factoid del contexto del reconocedor. Si el reconocedor no admite cualquiera de las opciones, se usa el valor predeterminado y se actualiza el menú.
Por último, el método UseRecognizer adjunta la propiedad Strokes del objeto InkDisp del recopilador de lápiz al contexto del reconocedor, cambia la fuente de la ventana de salida a una compatible con el idioma del reconocedor, restablece la ventana de salida y actualiza los resultados de reconocimiento llamando al método BackgroundRecognizeWithAlternates del contexto del reconocedor.
Se llama al método GetGestureName de la ventana desde el método OnGesture de la ventana. Busca el gesto y devuelve un índice al nombre del gesto, que se almacena en una tabla de cadenas en el archivo AdvReco.rc.