Freigeben über


Beispiel für grundlegende Erkennung

Diese Anwendung veranschaulicht, wie Sie eine einfache Handschrifterkennungsanwendung erstellen können.

Dieses Programm erstellt ein InkCollector-Objekt, um das Fenster freizugeben, und ein Standarderkennungskontextobjekt. Beim Empfang des Befehls "Recognize!" aus dem Menü der Anwendung werden die gesammelten Freihandstriche an den Erkennungskontext übergeben. Die beste Ergebniszeichenfolge wird in einem Meldungsfeld angezeigt.

Erstellen des RecognizerContext-Objekts

In der WndProc-Prozedur für die Anwendung wird beim Empfang der WM_CREATE-Meldung beim Start ein neuer Erkennungskontext erstellt, der die Standarderkennung verwendet. Dieser Kontext wird für die gesamte Erkennung in der Anwendung verwendet.

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

Erkennen der Striche

Der Erkennungsbefehl wird empfangen, wenn der Benutzer auf Erkennen! auf Updates zugreifen. Der Code ruft einen Zeiger auf die InkStrokes (pIInkStrokes) des InkDisp-Objekts ab und übergibt dann die InkStrokes mithilfe eines Aufrufs von putref_Strokes an den Erkennungskontext.

 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)) 
          {

Der Code ruft dann die Recognize-Methode des InkRecognizerContext-Objekts auf und übergibt einen Zeiger an ein IInkRecognitionResult-Objekt , um die Ergebnisse zu speichern.

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

Schließlich verwendet der Code die TopString-Eigenschaft des IInkRecognitionResult-Objekts, um das höchste Erkennungsergebnis in einer Zeichenfolgenvariablen abzurufen, das IInkRecognitionResult-Objekt freizugeben und die Zeichenfolge in einem Meldungsfeld anzuzeigen.

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

Stellen Sie sicher, dass Sie den Erkennungskontext zwischen Verwendungen zurücksetzen.

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