Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ta aplikacja pokazuje, jak utworzyć prostą aplikację rozpoznawania pisma ręcznego.
Ten program tworzy obiekt InkCollector w celu pisma odręcznego — włączanie okna i domyślnego obiektu kontekstu rozpoznawania. Po otrzymaniu polecenia "Recognize!" uruchomionego z menu aplikacji, zebrane pociągnięcia pisma odręcznego są przekazywane do kontekstu rozpoznawania. Najlepszy ciąg wyników jest wyświetlany w polu komunikatu.
Tworzenie obiektu RecognizerContext
W procedurze WndProc aplikacji, po odebraniu komunikatu WM_CREATE podczas uruchamiania, zostanie utworzony nowy kontekst dla rozpoznawania, który używa domyślnego rozpoznawacza. Ten kontekst jest używany do wszystkich funkcji rozpoznawania w aplikacji.
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;
}
//...
Rozpoznawanie pociągnięć
Polecenie rozpoznaj jest odbierane, gdy użytkownik kliknie przycisk Rozpoznaj! pozycja menu Kod pobiera wskaźnik do pisma odręcznego inkStrokes (pIInkStrokes) poza obiekt InkDisp, a następnie przekazuje InkStrokes do kontekstu rozpoznawania przy użyciu wywołania w celu 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))
{
Następnie kod wywołuje metodę Recognize obiektu InkRecognizerContext, przekazując wskaźnik do obiektu IInkRecognitionResult w celu przechowywania wyników.
// Recognize
IInkRecognitionResult* pIInkRecoResult = NULL;
hr = g_pIInkRecoContext->Recognize(&pIInkRecoResult);
if (SUCCEEDED(hr))
{
Na koniec kod używa właściwości IInkRecognitionResult obiektu TopString pobierania najwyższego wyniku rozpoznawania w zmiennej ciągu, zwalnia obiekt IInkRecognitionResult i wyświetla ciąg w polu komunikatu.
// 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);
} }
Pamiętaj, aby zresetować kontekst rozpoznawania między użyciami.
// Reset the recognizer context
g_pIInkRecoContext->putref_Strokes(NULL);
}
pIInkStrokes->Release();
}
// restore the cursor
::SetCursor(hCursor);
}