Dela via


Exempel på grundläggande igenkänning

Det här programmet visar hur du kan skapa en enkel handskrift igenkänningsprogram.

Det här programmet skapar ett InkCollector- objekt för att pennanteckning- aktivera fönstret och en standardkontext för identifierare objekt. När du får kommandot "Identifiera!" som utlöstes från programmets meny skickas de insamlade pennstrecken till identifierarkontexten. Den bästa resultatsträngen visas i en meddelanderuta.

Skapa RecognizerContext-objektet

I WndProc-proceduren för programmet skapas en ny identifierarkontext som använder standardigenkänningen när det WM_CREATE meddelandet tas emot vid start. Den här kontexten används för all igenkänning i programmet.

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

Känna igen tecken på stroke

Kommandot recognize tas emot när användaren klickar på Identifiera! Menyalternativet. Koden hämtar en pekare till bläck InkStrokes (pIInkStrokes) från objektet InkDisp och skickar sedan InkStrokes till identifierarkontexten med ett anrop till 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)) 
          {

Koden anropar sedan metoden Recognize för objektet InkRecognizerContext och skickar en pekare till ett IInkRecognitionResult objekt som innehåller resultatet.

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

Slutligen använder koden IInkRecognitionResult-objektets TopString-egenskap för att hämta det främsta igenkänningsresultatet till en strängvariabel. Därefter frigörs IInkRecognitionResult-objektet och strängen visas i en meddelanderuta.

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

Se till att återställa identifierarkontexten mellan användningarna.

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