Exemple de reconnaissance de base

Cette application montre comment vous pouvez créer une application de reconnaissance de l' écriture manuscrite simple.

Ce programme crée un objet InkCollector pour activer l' écriture manuscrite dans la fenêtre et un objet de contexte de reconnaissance par défaut. Lors de la réception du « Recognize ! » commande, déclenchée à partir du menu de l’application, les traits d’encre collectés sont transmis 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 pour l’application, quand 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 toutes les reconnaissances 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 quand l’utilisateur clique sur Recognize ! . Le code obtient un pointeur vers le InkStrokes d’entrée manuscrite (pIInkStrokes) de l’objet InkDisp , puis passe le InkStrokes au contexte de module de reconnaissance à l’aide d’un appel aux _ traits PutRef.

 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é de chaîne de l’objet IInkRecognitionResult pour 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);
  }