Ejemplo de reconocimiento básico
Esta aplicación muestra cómo puede crear una aplicación de reconocimiento de escritura a mano sencilla.
Este programa crea un objeto InkCollectorpara habilitar la ventana y un objeto de contexto de reconocedor predeterminado. Al recibir el comando "Recognize!", se desencadena desde el menú de la aplicación, los trazos de lápiz recopilados se pasan al contexto del reconocedor. La mejor cadena de resultado se presenta en un cuadro de mensaje.
Creación del objeto RecognizerContext
En el procedimiento WndProc de la aplicación, cuando se recibe el mensaje WM_CREATE al iniciarse, se crea un nuevo contexto de reconocedor que usa el reconocedor predeterminado. Este contexto se usa para todo el reconocimiento de la aplicación.
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;
}
//...
Reconocimiento de los trazos
El comando recognize se recibe cuando el usuario hace clic en Reconocer. . El código obtiene un puntero a la entrada de lápiz InkStrokes (pIInkStrokes) fuera del objeto InkDisp y, a continuación, pasa inkStrokes al contexto del reconocedor mediante una llamada 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))
{
A continuación, el código llama al método Recognize del objeto InkRecognizerContext , pasando un puntero a un objeto IInkRecognitionResult para contener los resultados.
// Recognize
IInkRecognitionResult* pIInkRecoResult = NULL;
hr = g_pIInkRecoContext->Recognize(&pIInkRecoResult);
if (SUCCEEDED(hr))
{
Por último, el código usa la propiedad TopString del objeto IInkRecognitionResult para recuperar el resultado de reconocimiento superior en una variable de cadena, libera el objeto IInkRecognitionResult y muestra la cadena en un cuadro de mensaje.
// 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);
} }
Asegúrese de restablecer el contexto del reconocedor entre usos.
// Reset the recognizer context
g_pIInkRecoContext->putref_Strokes(NULL);
}
pIInkStrokes->Release();
}
// restore the cursor
::SetCursor(hCursor);
}