Condividi tramite


Esempio di riconoscimento di base

Questa applicazione illustra come creare una semplice applicazione di riconoscimento della grafia.

Questo programma crea un oggettoInkCollectorper input penna. Abilitare la finestra e un contesto di riconoscimento predefinito oggetto. Dopo aver ricevuto il comando "Recognize!", attivato dal menu dell'applicazione, i tratti di inchiostro raccolti vengono passati al contesto di riconoscimento. La stringa di risultato migliore viene presentata in una finestra di messaggio.

Creazione dell'oggetto RecognizerContext

Nella procedura WndProc per l'applicazione, quando il messaggio di WM_CREATE viene ricevuto all'avvio, viene creato un nuovo contesto di riconoscimento che usa il riconoscitore predefinito. Questo contesto viene usato per tutto il riconoscimento nell'applicazione.

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

Riconoscere l'ictus

Il comando recognize viene ricevuto quando l'utente fa clic su Recognize! voce di menu. Il codice ottiene un puntatore all'oggetto ink InkStrokes (pIInkStrokes) dall'oggettoInkDispe quindi passa il InkStrokes al contesto del riconoscimento usando una chiamata a 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)) 
          {

Il codice chiama quindi il metodo Recognize dell'oggetto InkRecognizerContext, passando un puntatore a un oggetto IInkRecognitionResult per contenere i risultati.

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

Infine, il codice usa la proprietà IInkRecognitionResult oggetto TopString recuperare il risultato del riconoscimento principale in una variabile stringa, rilascia il oggetto IInkRecognitionResult e visualizza la stringa in una finestra di messaggio.

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

Assicurarsi di reimpostare il contesto di riconoscimento tra gli utilizzi.

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