Partager via


Exemple de reconnaissance de base

Cette application montre comment créer une application de reconnaissance d’écriture manuscrite simple.

Ce programme crée un objet InkCollectorpour activer la fenêtre et un objet de contexte de reconnaissance par défaut. À la réception de la commande « Reconnaître ! », déclenchée à partir du menu de l’application, les traits d’encre collectés sont passés au contexte du module de reconnaissance. La meilleure chaîne de résultat est présentée dans une boîte de message.

Création de l’objet RecognizerContext

Dans la procédure WndProc de l’application, lorsque le message WM_CREATE est reçu au démarrage, un nouveau contexte de module de reconnaissance qui utilise le module de reconnaissance par défaut est créé. Ce contexte est utilisé pour toute la reconnaissance dans l’application.

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;
    }
  //...

Reconnaissance des traits

La commande recognize est reçue lorsque l’utilisateur clique sur Reconnaître ! . Le code obtient un pointeur vers l’inkStrokes (pIInkStrokes) hors de l’objet InkDisp , puis passe l’inkStrokes au contexte du module de reconnaissance à l’aide d’un appel à 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)) 
          {

Le code appelle ensuite la méthode Recognize de l’objet InkRecognizerContext , en passant un pointeur vers un objet IInkRecognitionResult pour contenir les résultats.

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

Enfin, le code utilise la propriété TopString de l’objet IInkRecognitionResult récupérer le résultat de la reconnaissance supérieure dans une variable de chaîne, libère l’objet IInkRecognitionResult et affiche la chaîne dans une boîte de message.

                  // 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);
                  }  }
        

Veillez à réinitialiser le contexte du module de reconnaissance entre les utilisations.

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