Compartilhar via


Exemplo de reconhecimento básico

Este aplicativo demonstra como você pode criar um aplicativo simples de reconhecimento de manuscrito .

Este programa cria um objeto InkCollectorpara habilitar a janela e um objeto de contexto de reconhecedor padrão. Ao receber o comando "Reconhecer!", disparado no menu do aplicativo, os traços de tinta coletados são passados para o contexto do reconhecedor. A melhor cadeia de caracteres de resultado é apresentada em uma caixa de mensagem.

Criando o objeto RecognizerContext

No procedimento WndProc para o aplicativo, quando a mensagem WM_CREATE é recebida na inicialização, um novo contexto de reconhecedor que usa o reconhecedor padrão é criado. Esse contexto é usado para todo o reconhecimento no aplicativo.

case WM_CREATE:
{
    HRESULT hr;
    hr = CoCreateInstance(CLSID_InkRecognizerContext,
             NULL, CLSCTX_INPROC_SERVER, IID_IInkRecognizerContext,
             (void **) &g_pIInkRecoContext);
    if (FAILED(hr))
    {
        ::MessageBox(NULL, TEXT("There are no handwriting recognizers installed.\n"
            "You need to have at least one in order to run this sample.\nExiting."),
            gc_szAppName, MB_ICONERROR);
        return -1;
    }
  //...

Reconhecendo os Traços

O comando recognize é recebido quando o usuário clica em Reconhecer! . O código obtém um ponteiro para a tinta InkStrokes (pIInkStrokes) do objeto InkDisp e, em seguida, passa os InkStrokes para o contexto do reconhecedor usando uma chamada para putref_Strokes.

 case WM_COMMAND:
  //...
  else if (wParam == ID_RECOGNIZE)
  {
      // change cursor to the system's Hourglass
      HCURSOR hCursor = ::SetCursor(::LoadCursor(NULL, IDC_WAIT));
      // Get a pointer to the ink stroke collection
      // This collection is a snapshot of the entire ink object
      IInkStrokes* pIInkStrokes = NULL;
      HRESULT hr = g_pIInkDisp->get_Strokes(&pIInkStrokes);
      if (SUCCEEDED(hr)) 
      {
          // Pass the stroke collection to the recognizer context
          hr = g_pIInkRecoContext->putref_Strokes(pIInkStrokes);
          if (SUCCEEDED(hr)) 
          {

Em seguida, o código chama o método Recognize do objeto InkRecognizerContext , passando um ponteiro para um objeto IInkRecognitionResult para manter os resultados.

              // Recognize
              IInkRecognitionResult* pIInkRecoResult = NULL;
              hr = g_pIInkRecoContext->Recognize(&pIInkRecoResult);
              if (SUCCEEDED(hr)) 
              {

Por fim, o código usa a propriedade TopString do objeto IInkRecognitionResult para recuperar o resultado de reconhecimento superior em uma variável de cadeia de caracteres, libera o objeto IInkRecognitionResult e exibe a cadeia de caracteres em uma caixa de mensagem.

                  // Get the best result of the recognition 
                  BSTR bstrBestResult = NULL;
                  hr = pIInkRecoResult->get_TopString(&bstrBestResult);
                  pIInkRecoResult->Release();
                  pIInkRecoResult = NULL;

                  // Show the result string
                  if (SUCCEEDED(hr) && bstrBestResult)
                  {
                      MessageBoxW(hwnd, bstrBestResult, 
                                  L"Recognition Results", MB_OK);
                      SysFreeString(bstrBestResult);
                  }  }
        

Certifique-se de redefinir o contexto do reconhecedor entre usos.

              // Reset the recognizer context
              g_pIInkRecoContext->putref_Strokes(NULL);
          }
          pIInkStrokes->Release();
      }
      // restore the cursor
      ::SetCursor(hCursor);
  }