Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tato aplikace ukazuje, jak můžete vytvořit jednoduchou aplikaci pro rozpoznávání rukopisu.
Tento program vytvoří objekt InkCollector pro rukopisu – povolte okno a výchozí kontext objekt rozpoznávání objektu. Po zvolení příkazu "Rozpoznat!" z nabídky aplikace se shromážděné tahy rukopisu předají do kontextu nástroje pro rozpoznávání. Nejlepší výsledný řetězec se zobrazí v poli se zprávou.
Vytvoření objektu RecognizerContext
V postupu WndProc pro aplikaci při přijetí WM_CREATE zprávy při spuštění je vytvořen nový kontext rozpoznávání, který používá výchozí rozpoznávání. Tento kontext se používá pro veškeré rozpoznávání v aplikaci.
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;
}
//...
Rozpoznávání tahů
Příkaz pro rozpoznávání se obdrží, když uživatel klikne na tlačítko Rozpoznat. položka v menu. Kód získá ukazatel na rukopisný Rukopisné tahy (pIInkStrokes) mimo objekt InkDisp a pak předá Rukopisné tahy do kontextu rozpoznávání pomocí volání 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))
{
Kód pak volá metodu Recognize objektu InkRecognizerContext a předává ukazatel na objekt IInkRecognitionResult k uložení výsledků.
// Recognize
IInkRecognitionResult* pIInkRecoResult = NULL;
hr = g_pIInkRecoContext->Recognize(&pIInkRecoResult);
if (SUCCEEDED(hr))
{
Nakonec kód používá vlastnost objektu IInkRecognitionResultTopString k načtení nejvyššího výsledku rozpoznávání do řetězcové proměnné, uvolní objekt IInkRecognitionResult a zobrazí řetězec v dialogovém okně.
// 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);
} }
Nezapomeňte resetovat kontext rozpoznávání mezi využitím.
// Reset the recognizer context
g_pIInkRecoContext->putref_Strokes(NULL);
}
pIInkStrokes->Release();
}
// restore the cursor
::SetCursor(hCursor);
}