Exemplo de reconhecimento avançado
O exemplo de reconhecimento avançado demonstra recursos avançados da API (interface de programação de aplicativos) da Automação de Tablets da Microsoft usada para reconhecimento de manuscrito.
Ele contém os seguintes recursos:
- Enumerando o reconhecedor instalado
- Criando um contexto de reconhecedor com um idioma específico
- Usando o objeto reconhecedor
- Definindo listas de palavras e factoid de reconhecimento
- Usando guias para melhorar a qualidade do reconhecimento
- Reconhecimento dinâmico em segundo plano
- Reconhecimento de gestos
As interfaces usadas são: IInkRecognizer, IInkRecoContext, IInkRecognitionResult, IInkRecognitionGuide, IInkWordList, IInkGesture, IInkCollector, IInkDisp, IInkRenderer, IInkDrawingAttributes, IInkStrokes e IInkStroke.
Cabeçalhos de tinta e projeto
Primeiro, inclua os cabeçalhos para interfaces de Automação de TABLET PC. Eles são instalados com o SDK do Tablet PC Platform. O arquivo TpcError.h contém as definições de Código de Erro da API do Tablet PC.
#include <msinkaut.h>
#include <msinkaut_i.c>
#include <TpcError.h>
O arquivo EventSinks.h define as interfaces IInkEventsImpl e IInkRecognitionEventsImpl e configura os eventos RecognitionWithAlternates, Stroke e Gesture .
#include "EventSinks.h"
O arquivo ChildWnds.h contém as definições das classes CInkInputWnd e CRecoOutputWnd, que são derivadas do CWindowImpl da ATL e usadas para criar as janelas filho da amostra.
#include "ChildWnds.h"
O arquivo AdvReco.h declara a classe CAdvRecoApp , que é a classe de janela do aplicativo para este exemplo.
#include "AdvReco.h"
Inicializando a janela do aplicativo
O método da Run
janela configura o objeto CAdvRecoApp , carrega o menu e o ícone da janela, cria um objeto InkRecognizerContext para o reconhecedor padrão e inicia o loop de mensagem da janela.
O método OnCreate da janela manipula o evento WM_CREATE e cria as janelas filho. Um objeto InkCollector se conecta à origem do evento do coletor de tinta e habilita a entrada de tinta na janela de entrada. Em seguida, ele cria um objeto InkRecognizerGuide e usa a propriedade Renderer do coletor de tinta para converter os retângulos da caixa de guia de reconhecimento em espaço à tinta. Por fim, o método OnCreate cria um objeto InkWordList .
Manipulando eventos do coletor de tinta
O método OnStroke da janela manipula o evento Stroke do coletor de tinta. O novo objeto IInkStrokeDisp é adicionado aos InkStrokes da propriedade Ink do coletor de tinta.
O método OnGesture da janela manipula o evento Gesture do coletor de tinta. O método OnGesture identifica o gesto, usando o gesto de confiança mais alto primeiro, e verifica se a janela dá suporte a esse gesto específico. Se houver suporte para o gesto, a caixa delimitadora do gesto será invalidada, pois o gesto será removido da coleção strokes. Se não houver suporte para o gesto, o evento Gesture será cancelado, o que faz com que o coletor de tinta gere um evento stroke . Por fim, a janela de resultados é atualizada.
Manipulando eventos de contexto do reconhecedor
O método OnRecognitionWithAlternates da janela manipula o evento RecognitionWithAlternates do contexto do reconhecedor. O método OnRecognitionWithAlternates exibe os resultados do reconhecimento na janela de resultados.
Comandos de menu de manipulação
O método OnRecognizer da janela manipula os comandos no menu Reconhecedor. Se o comando Padrão tiver sido selecionado, o método GetDefaultRecognizer dos InkRecognizers será usado para recuperar o reconhecedor padrão; caso contrário, o reconhecedor selecionado será recuperado. Em seguida, um contexto de reconhecedor é criado e usado, e o menu e status barra são atualizados.
O método OnFactoidWordlist da janela manipula o comando Usar Wordlist no menu Factoid . A propriedade Strokes do contexto do reconhecedor é definida como NULL para redefinir o contexto do reconhecedor. Se a opção Usar Wordlist estiver desativada, a propriedade WordList do contexto do reconhecedor será definida como NULL; caso contrário, a propriedade WordList do contexto do reconhecedor é definida como InkWordList que foi criado no método OnCreate . Por fim, os InkStrokes do coletor de tinta são reanexados ao contexto do reconhecedor, o método BackgroundRecognizeWithAlternates do contexto do reconhecedor é chamado e o menu é atualizado.
O método OnFactoid da janela manipula os comandos factoid no menu Factoid . Primeiro, ele define a propriedade Strokes do contexto do reconhecedor como NULL, define a propriedade Factoid do contexto do reconhecedor como o factóide selecionado e reatribui os InkStrokes do coletor de tinta ao contexto do reconhecedor. Se o objeto Factoid for compatível com o contexto do reconhecedor, o método BackgroundRecognizeWithAlternates do contexto do reconhecedor será chamado; caso contrário, uma mensagem de erro será exibida. Por fim, o menu e a barra de status são atualizados.
O método OnGuide da janela manipula os comandos no menu Guia . Se o contexto do reconhecedor der suporte às opções de guia, o método OnGuide definirá a propriedade Strokes do contexto do reconhecedor como NULL, definirá a propriedade Guide do contexto do reconhecedor para a configuração de guia selecionada, reatribuirá os InkStrokes do coletor de tinta ao contexto do reconhecedor e chamará o método BackgroundRecognizeWithAlternates do contexto do reconhecedor. Caso contrário, uma mensagem de erro será exibida. Por fim, a janela de entrada, o menu e a barra de status são atualizados.
O método OnMode da janela manipula os comandos no menu Modo . Ele desabilita o coletor de tinta, atualiza a propriedade CollectionMode do coletor de tinta, atualiza o menu e mostra ou oculta as listas de gestos. Por fim, o coletor de tinta está habilitado.
O método OnRecognize da janela manipula o comando Recognize no menu Ink. Ele chama o método EndInkInput do contexto do reconhecedor para impedir que a tinta seja adicionada ao contexto do reconhecedor. Às vezes, isso é necessário, pois nem todos os reconhecedores dão suporte ao reconhecimento parcial. Em seguida, ele chama o método Recognize do contexto do reconhecedor e passa os resultados para o método OnRecognitionWithAlternates da janela. Por fim, os InkStrokes do coletor de tinta são reatribuídos ao contexto do reconhecedor.
O método OnClear da janela manipula o comando Clear no menu Ink . Ele exclui os traços da propriedade Ink do coletor de tinta, libera a coleção de traços antigos e cria um novo para a propriedade Ink do coletor de tinta e anexa a nova coleção de traços ao contexto do reconhecedor.
O método OnExit da janela manipula o comando Exit no menu Ink e gera o evento WM_CLOSE.
Métodos auxiliares
O método LoadMenu da janela é chamado do método Run da janela e adiciona a lista de reconhecedores com suporte e a lista de factoids com suporte ao menu. Primeiro, ele recupera os InkRecognizers. Em seguida, itera por meio dos reconhecedores disponíveis e seleciona apenas os que têm uma lista de idiomas na propriedade Idiomas , que ela adiciona ao menu Reconhecedor . Por fim, ele preenche o menu Factoid com a lista de factóides definida como uma constante global.
O método UseRecognizer da janela é chamado do método OnRecognizer da janela quando o usuário seleciona um novo reconhecedor. Ele cria um contexto de reconhecedor, desanexa o contexto antigo do coletor de eventos do reconhecedor, limpa e libera o contexto antigo e anexa o novo contexto ao coletor de eventos do reconhecedor.
Em seguida, o método UseRecognizer verifica a propriedade Capabilities do reconhecedor, que retorna um valor InkRecognizerCapabilities . Se o reconhecedor der suporte à entrada forrada, o comando Linhas no menu Guia estará habilitado. Se o reconhecedor der suporte à entrada em caixa, o comando Caixas estará habilitado. Se o reconhecedor não der suporte à entrada gratuita, o comando None será desabilitado. Se não houver suporte para a seleção do guia atual, a propriedade Guide do contexto do reconhecedor e o menu serão atualizados.
Em seguida, o método UseRecognizer tenta definir as propriedades WordList e Factoid do contexto do reconhecedor. Se nenhuma das configurações tiver suporte do reconhecedor, o valor padrão será usado e o menu será atualizado.
Por fim, o método UseRecognizer anexa a propriedade Strokes do objeto InkDisp do coletor de tinta ao contexto do reconhecedor, altera a fonte da janela de saída para uma compatível com o idioma do reconhecedor, redefine a janela de saída e atualiza os resultados do reconhecimento chamando o método BackgroundRecognizeWithAlternates do contexto do reconhecedor.
O método GetGestureName da janela é chamado do método OnGesture da janela. Ele pesquisa o gesto e retorna um índice para o nome do gesto, que é armazenado em uma tabela de cadeia de caracteres no arquivo AdvReco.rc.