Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu örnek, el yazısı tanıma için kullanılan MicrosoftTablet PC Otomasyonu uygulama programlama arabiriminin (API) gelişmiş özelliklerini gösterir.
Aşağıdakileri içerir:
- Yüklü tanıyıcıları numaralandırma
- Belirli bir dil tanıyıcısıyla tanıyıcı bağlamı oluşturma
- Tanıma sonuçlarını vuruş koleksiyonu ile serileştirme
- vuruş koleksiyonlarını InkDisp nesnesi içinde özel bir koleksiyon halinde düzenleme
- mürekkep nesnelerini serileştirme ve bunları mürekkep serileştirilmiş biçim (ISF) dosyasından geri alma
- Tanıyıcı giriş kılavuzlarını ayarlama
- Eşzamanlı ve eşzamansız tanımayı kullanma
Mürekkep Üst Bilgileri
İlk olarak, Tablet PC Otomasyonu arabirimleri için üst bilgileri ekleyin. Bunlar Microsoft Windows XP Tablet PC Edition Yazılım Geliştirme Seti (SDK) ile birlikte yüklenir.
#include <msinkaut.h>
#include <msinkaut_i.c>
EventSinks.h dosyası IInkEventsImpl ve IInkRecognitionEventsImpl arabirimlerini tanımlar.
#include "EventSinks.h"
Yüklü Tanıyıcıları Numaralandırma
Uygulamanın LoadMenu yöntemi, Yeni Vuruş Oluştur menüsünü kullanılabilir tanıyıcılarla doldurur. Bir InkRecognizers oluşturuldu. InkRecognizers nesnesinin Languages özelliği boş değilse, tanıyıcı bir metin tanıyıcıdır ve Adı özelliğinin değeri menüye eklenir.
// Create the enumerator for the installed recognizers
hr = m_spIInkRecognizers.CoCreateInstance(CLSID_InkRecognizers);
...
// Filter out non-language recognizers by checking for
// the languages supported by the recognizer - there is not
// any if it is a gesture or object recognizer.
CComVariant vLanguages;
if (SUCCEEDED(spIInkRecognizer->get_Languages(&vLanguages)))
{
if ((VT_ARRAY == (VT_ARRAY & vLanguages.vt)) // it should be an array
&& (NULL != vLanguages.parray)
&& (0 < vLanguages.parray->rgsabound[0].cElements)) // with at least one element
{
// This is a language recognizer. Add its name to the menu.
CComBSTR bstrName;
if (SUCCEEDED(spIInkRecognizer->get_Name(&bstrName)))
...
}
}
Mürekkep Toplayıcı oluşturma
Uygulamanın OnCreate yöntemi bir InkCollector nesnesi oluşturur, bunu olay kaynağına bağlar ve mürekkep koleksiyonunu etkinleştirir.
// Create an ink collector object.
hr = m_spIInkCollector.CoCreateInstance(CLSID_InkCollector);
// Establish a connection to the collector's event source.
hr = IInkCollectorEventsImpl<CMultiRecoApp>::DispEventAdvise(m_spIInkCollector);
// Enable ink input in the m_wndInput window
hr = m_spIInkCollector->put_hWnd((long)m_wndInput.m_hWnd);
hr = m_spIInkCollector->put_Enabled(VARIANT_TRUE);
Tanıyıcı Bağlamı Oluşturma
Uygulamanın CreateRecoContext yöntemi yeni bir tanıyıcı bağlamı oluşturup başlatır ve ilişkili dil tarafından desteklenen kılavuzları ayarlar. IInkRecognizer nesnesinin CreateRecognizerContext yöntemi, dil için bir IInkRecognizerContext2 nesnesi oluşturur. Gerekirse eski tanıyıcı bağlamı değiştirilir. Bağlam, olay kaynağına bağlıdır. Son olarak, tanıyıcı bağlamının Yetkinlikler özelliği, tanıyıcı bağlamının hangi kılavuzları desteklediğini kontrol etmek için denetlenmektedir.
// Create a recognizer context
CComPtr<IInkRecognizerContext2> spNewContext;
if (FAILED(pIInkRecognizer2->CreateRecognizerContext(&spNewContext)))
return false;
// Replace the current context with the new one
if (m_spIInkRecoContext != NULL)
{
// Close the connection to the recognition events source
IInkRecognitionEventsImpl<CMultiRecoApp>::DispEventUnadvise(m_spIInkRecoContext);
}
m_spIInkRecoContext.Attach(spNewContext.Detach());
// Establish a connection with the recognizer context's event source
if (FAILED(IInkRecognitionEventsImpl<CMultiRecoApp>::DispEventAdvise(m_spIInkRecoContext)))
...
// Set the guide if it's supported by the recognizer and has been created
int cRows = 0, cColumns = 0;
InkRecognizerCapabilities dwCapabilities = IRC_DontCare;
if (SUCCEEDED(pIInkRecognizer->get_Capabilities(&dwCapabilities)))
...
Vuruşları Toplama ve Tanıma Sonuçlarını Görüntüleme
Uygulamanın OnStroke yöntemi, mürekkep toplayıcısının InkStrokes günceller, mevcut asenkron tanıma isteklerini iptal eder ve tanıyıcı bağlamında bir tanıma isteği oluşturur.
// Add the new stroke to the current collection
hr = m_spIInkStrokes->Add(pIInkStroke);
if (SUCCEEDED(hr))
{
// Cancel the previous background recognition requests
// which have not been processed yet
m_spIInkRecoContext->StopBackgroundRecognition();
// Ask the context to update the recognition results with newly added strokes
// When the results are ready, the recognizer context returns them
// through the corresponding event RecognitionWithAlternates
CComVariant vCustomData;
m_spIInkRecoContext->BackgroundRecognize(vCustomData);
}
Uygulamanın OnRecognition yöntemi, tanıma isteğinin sonuçlarını çıkış penceresinin UpdateString yöntemine gönderir.
// Update the output window with the new results
m_wndResults.UpdateString(bstrRecognizedString);
Vuruşları ve Tanıma Sonuçlarını Silme
Uygulamanın OnClear yöntemi, InkDisp nesnesinden tüm vuruşları ve tanıma sonuçlarını siler ve pencereleri temizler. Tanıyıcı bağlamın InkStrokes koleksiyonuyla ilişkisi kaldırılır.
// Detach the current stroke collection from the recognizer context and release it
if (m_spIInkRecoContext != NULL)
m_spIInkRecoContext->putref_Strokes(NULL);
m_spIInkStrokes.Release();
// Clear the custom strokes collection
if (m_spIInkCustomStrokes != NULL)
m_spIInkCustomStrokes->Clear();
// Delete all strokes from the Ink object
// Passing NULL as a stroke collection pointer means asking to delete all strokes
m_spIInkDisp->DeleteStrokes(NULL);
// Get a new stroke collection from the ink object
...
// Ask for an empty collection by passing an empty variant
if (SUCCEEDED(m_spIInkDisp->CreateStrokes(v, &m_spIInkStrokes)))
{
// Attach it to the recognizer context
if (FAILED(m_spIInkRecoContext->putref_Strokes(m_spIInkStrokes)))
...
}
Tanıyıcı Bağlamlarını Değiştirme
Kullanıcı Yeni Vuruş Oluştur menüsünde bir tanıyıcı seçtiğinde uygulamanın OnNewStrokes yöntemi çağrılır. Geçerli InkStrokes kaydedilir. Farklı bir dil tanıyıcı seçildiyse, yeni bir tanıyıcı bağlamı oluşturulur. Ardından, yeni bir InkStrokes yeni tanıyıcı bağlamına eklenir.
// Save the current stroke collection if there is any
if (m_spIInkRecoContext != NULL)
{
// Cancel the previous background recognition requests
// which have not been processed yet
m_spIInkRecoContext->StopBackgroundRecognition();
// Let the context know that there'll be no more input
// for the attached stroke collection
m_spIInkRecoContext->EndInkInput();
// Add the stroke collection to the Ink object's CustomStrokes collection
SaveStrokeCollection();
}
...
// If a different recognizer was selected, create a new recognizer context
// Else, reuse the same recognizer context
if (wID != m_nCmdRecognizer)
{
// Get a pointer to the recognizer object from the recognizer collection
CComPtr<IInkRecognizer> spIInkRecognizer;
if ((m_spIInkRecognizers == NULL)
|| FAILED(m_spIInkRecognizers->Item(wID - ID_RECOGNIZER_FIRST,
&spIInkRecognizer))
|| (false == CreateRecoContext(spIInkRecognizer)))
{
// restore the cursor
::SetCursor(hCursor);
return 0;
}
// Update the status bar
m_bstrCurRecoName.Empty();
spIInkRecognizer->get_Name(&m_bstrCurRecoName);
UpdateStatusBar();
// Store the selected recognizer's command id
m_nCmdRecognizer = wID;
}
Ardından StartNewStrokeCollection'ı çağırarak boş bir InkStrokes oluşturur ve bunu tanıyıcı bağlamla iliştirir.
Bir Tanıyıcı Bağlamı için Strokes Koleksiyonunu Kaydetme
Uygulamanın SaveStrokeCollection yöntemi mevcut bir tanıyıcı bağlamını kontrol eder ve geçerli vuruşlar koleksiyonunun tanınmasını tamamlar. Ardından InkStrokes koleksiyonu mürekkep nesnesinin CustomStrokes eklenir.
if (m_spIInkRecoContext != NULL)
{
if (SUCCEEDED(m_spIInkStrokes->get_Count(&lCount)) && 0 != lCount)
{
CComPtr<IInkRecognitionResult> spIInkRecoResult;
InkRecognitionStatus RecognitionStatus;
if (SUCCEEDED(m_spIInkRecoContext->Recognize(&RecognitionStatus, &spIInkRecoResult)))
{
if (SUCCEEDED(spIInkRecoResult->SetResultOnStrokes()))
{
CComBSTR bstr;
spIInkRecoResult->get_TopString(&bstr);
m_wndResults.UpdateString(bstr);
}
...
}
}
// Detach the stroke collection from the old recognizer context
m_spIInkRecoContext->putref_Strokes(NULL);
}
// Now add it to the ink's custom strokes collection
// Each item (stroke collection) of the custom strokes must be identified
// by a unique string. Here we generate a GUID for this.
if ((0 != lCount) && (m_spIInkCustomStrokes != NULL))
{
GUID guid;
WCHAR szGuid[40]; // format: "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"
if (SUCCEEDED(::CoCreateGuid(&guid))
&& (::StringFromGUID2(guid, szGuid, countof(szGuid)) != 0))
{
CComBSTR bstrGuid(szGuid);
if (FAILED(m_spIInkCustomStrokes->Add(bstrGuid, m_spIInkStrokes)))
...