Пример расширенного распознавания
В примере расширенного распознавания демонстрируются расширенные возможности программного интерфейса (API) службы автоматизации microsoft tablet PC Automation, используемого для распознавания рукописного ввода.
Он включает следующие компоненты.
- Перечисление установленного распознавателя
- Создание контекста распознавателя с определенным языком
- Использование объекта распознавателя
- Настройка фактоидов распознавания и списков слов
- Использование руководств для повышения качества распознавания
- Динамическое распознавание фона
- Распознавание жестов
Используются следующие интерфейсы: 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, которые являются производными от CWindowImpl atl и используются для создания дочерних окон примера.
#include "ChildWnds.h"
Файл AdvReco.h объявляет класс CAdvRecoApp , который является классом окна приложения для этого примера.
#include "AdvReco.h"
Инициализация окна приложения
Метод окна Run
настраивает объект CAdvRecoApp , загружает меню и значок окна, создает объект InkRecognizerContext для распознавателя по умолчанию и запускает цикл сообщений окна.
Метод OnCreate окна обрабатывает событие WM_CREATE и создает дочерние окна. Объект InkCollector подключается к источнику событий сборщика рукописного ввода и включает рукописный ввод в окне ввода. Затем он создает объект InkRecognizerGuide и использует свойство Renderer сборщика рукописного ввода для преобразования прямоугольников направляющих распознавания в пространство рукописного ввода. Наконец, метод OnCreate создает объект InkWordList .
Обработка событий сборщика рукописного ввода
Метод OnStroke окна обрабатывает событие Stroke сборщика рукописного ввода. Новый объект IInkStrokeDisp добавляется в InkStrokes свойства Ink Collector Ink .
Метод OnGesture окна обрабатывает событие Жест сборщика рукописного ввода. Метод OnGesture идентифицирует жест, сначала используя жест с наивысшей достоверностью, и проверяет, поддерживает ли окно этот жест. Если жест поддерживается, ограничивающий прямоугольник жеста становится недействительным, так как жест удаляется из коллекции штрихов. Если жест не поддерживается, событие Жест отменяется, что приводит к тому, что сборщик рукописного ввода вызывает событие Stroke . Наконец, окно результатов обновляется.
Обработка событий контекста Распознавателя
Метод OnRecognitionWithAlternates окна обрабатывает событие RecognitionWithAlternates контекста распознавателя. Метод OnRecognitionWithAlternates отображает результаты распознавания в окне результатов.
Обработка команд меню
Метод OnRecognizer окна обрабатывает команды в меню Распознавателя. Если выбрана команда Default , то для получения распознавателя по умолчанию используется метод GetDefaultRecognizersinkRecognizers ; в противном случае извлекается выбранный распознаватель. Затем создается и используется контекст распознавателя, а также обновляется меню и строка состояния.
Метод OnFactoidWordlist окна обрабатывает команду Использовать wordlist в меню Factoid . Свойство Strokes контекста распознавателя имеет значение NULL , чтобы сбросить контекст распознавателя. Если параметр Использовать wordlist отключен, свойство WordList контекста распознавателя имеет значение NULL; В противном случае свойству WordList контекста распознавателя присваивается значение InkWordList , созданное в методе OnCreate . Наконец, inkStrokes сборщика рукописного ввода повторно присоединяется к контексту распознавателя, вызывается метод BackgroundRecognizeWithAlternates контекста распознавателя, и меню обновляется.
Метод OnFactoid окна обрабатывает команды factoid в меню Factoid . Сначала он задает для свойства Strokes контекста распознавателя значение NULL, задает для свойства Factoid контекста распознавателя значение выбранного factoid и переназначает inkStrokes сборщика рукописного ввода контексту распознавателя. Если объект Factoid поддерживается контекстом распознавателя, вызывается метод BackgroundRecognizeWithAlternates контекста распознавателя; в противном случае отображается сообщение об ошибке. Наконец, меню и строка состояния обновляются.
Метод OnGuide окна обрабатывает команды в меню Направляющие . Если контекст распознавателя поддерживает параметры направляющей, метод OnGuide присваивает свойству Strokes контекста распознавателя значение NULL, присваивает свойству Guide контекста распознавателя значение выбранного параметра направляющей, переназначает InkStrokes сборщика рукописного ввода контексту распознавателя и вызывает метод BackgroundRecognizeWithAlternates контекста распознавателя. В противном случае отображается сообщение об ошибке. Наконец, окно ввода, меню и строка состояния обновляются.
Метод OnMode окна обрабатывает команды в меню Режим . Он отключает сборщик рукописного ввода, обновляет свойство CollectionMode сборщика рукописного ввода, обновляет меню, а также отображает или скрывает списки жестов. Наконец, сборщик рукописного ввода включен.
Метод OnRecognize окна обрабатывает команду Recognize в меню Рукописный ввод. Он вызывает метод EndInkInput контекста распознавателя, чтобы не допустить добавления рукописного ввода в контекст распознавателя. Иногда это необходимо, так как не все распознаватели поддерживают частичное распознавание. Затем он вызывает метод Recognize контекста распознавателя и передает результаты в метод OnRecognitionWithAlternates окна. Наконец, inkStrokes сборщика рукописного ввода переназначается контексту распознавателя.
Метод OnClear окна обрабатывает команду Clear в меню Рукописный ввод . Он удаляет штрихи из свойства Ink сборщика рукописного ввода, освобождает старую коллекцию штрихов и создает новую для свойства Ink сборщика рукописного ввода и присоединяет новую коллекцию штрихов к контексту распознавателя.
Метод OnExit окна обрабатывает команду Exit в меню Рукописный ввод и вызывает событие WM_CLOSE.
Вспомогательные методы
Метод LoadMenu окна вызывается из метода Run окна и добавляет в меню список поддерживаемых распознавителей и список поддерживаемых фактоидов. Во-первых, он извлекает InkRecognizers. Затем он выполняет итерацию по доступным распознавателям и выбирает только те из них, которые имеют список языков в свойстве Языки , которое добавляется в меню Распознавателя . Наконец, он заполняет меню Factoid списком фактоидов, определенных как глобальная константа.
Метод UseRecognizer окна вызывается из метода OnRecognizer окна, когда пользователь выбирает новый распознаватель. Он создает контекст распознавателя, отсоединяет старый контекст от приемника событий распознавателя, очищает и освобождает старый контекст, а также присоединяет новый контекст к приемнику событий распознавателя.
Затем метод UseRecognizer проверяет свойство Capabilities распознавателя, которое возвращает значение InkRecognizerCapabilities . Если распознаватель поддерживает ввод со строкой, команда Строки в меню Направляющие включена. Если распознаватель поддерживает коробные входные данные, команда Boxes включена. Если распознаватель не поддерживает бесплатный ввод, команда None отключена. Если выбор текущей направляющей не поддерживается, обновляются как свойство Guide контекста распознавателя, так и меню.
Затем метод UseRecognizer пытается задать свойства WordList и Factoid контекста распознавателя. Если распознаватель не поддерживает любой из этих параметров, используется значение по умолчанию и меню обновляется.
Наконец, метод UseRecognizer присоединяет свойство Strokes объекта InkDisp сборщика рукописного ввода к контексту распознавателя, изменяет шрифт окна вывода на шрифт, поддерживаемый языком распознавателя, сбрасывает окно вывода и обновляет результаты распознавания, вызывая метод BackgroundRecognizeWithAlternates контекста распознавателя.
Метод GetGestureName окна вызывается из метода OnGesture окна. Он выполняет поиск жеста и возвращает индекс имени жеста, который хранится в строковой таблице в файле AdvReco.rc.