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 program, yalnızca C++ kullanarak InkCollector olaylarını yakalayan bir uygulamayı nasıl oluşturabileceğinizi gösterir. Bu program, pencereye mürekkep -enable için bir InkCollector nesnesi oluşturur. Stroke olayı alındığında bir ileti kutusu görüntüler.
Mürekkep Toplayıcı Olayları için Sarmalayıcı Tanımlama
InkCollectorEvents Sınıfı, mürekkep toplayıcı olaylarını mürekkep toplayıcısından bu sınıfın kullanıcısına geçirmeyi işler.
AdviseInkCollector yöntemi, InkCollector nesnesi ile bu sınıf arasındaki bağlantıyı ayarlar.
Invoke yöntemi, IDispatch olay bildirimini, bu sınıfın kullanıcısının belirli bir olayı işlemek için geçersiz kabileceği bir sanal işlev çağrısına dönüştürür.
Not
Bu olayı almak için bir olay işleyicisi için sanal işlevi geçersiz kılmaktan fazlasını yapmanız gerekir. Varsayılan olaylar haricinde, olay almayı garanti etmek için mürekkep toplayıcısının SetEventInterest yöntemini çağırmanız gerekir. İkinci olarak, bu nesne kendisini serbest iş parçacıklı olarak yürütür, bu nedenle tüm uygulanan olay işleyicilerinin de serbest iş parçacıklı olması gerekir. Özellikle önemli olan Windows API'lerini kullanmaktır. Bu, olay işleyicisinin mürekkep toplayıcısıyla bağlantılı pencereyle aynı iş parçacığında çalışması garanti edilmediğinden başka bir iş parçacığına geçiş yapılmasına neden olabilir.
// Invoke translates from IDispatch to an event callout
// that can be overridden by a subclass of this class.
STDMETHOD(Invoke)(
DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD /*wFlags*/,
DISPPARAMS* pdispparams,
VARIANT* pvarResult,
EXCEPINFO* /*pexcepinfo*/,
UINT* /*puArgErr*/)
{
switch(dispidMember)
{
case DISPID_ICEStroke:
Stroke(
(IInkCursor*) pdispparams->rgvarg[2].pdispVal,
(IInkStrokeDisp*) pdispparams->rgvarg[1].pdispVal,
(VARIANT_BOOL *)pdispparams->rgvarg[0].pboolVal);
break;
...
}
return S_OK;
}
virtual void Stroke(
IInkCursor* Cursor,
IInkStrokeDisp* Stroke,
VARIANT_BOOL *Cancel)
{
// This is a place holder designed to be overridden by
// user of this class.
return;
}
...
Init yöntemi, serbest iş parçacıklı sıralayıcıyı ayarlamak için CoCreateFreeThreadedMarshaler'yi çağırır.
// Init: set up free threaded marshaller.
HRESULT Init()
{
return CoCreateFreeThreadedMarshaler(this, &m_punkFTM);
}
AdviseInkCollector yöntemi, InkCollector nesnesi ile bu sınıf arasındaki bağlantıyı ayarlar. İlk olarak mürekkep toplayıcısına bir bağlantı noktasına erişir. Ardından denetimle bir danışmanlık bağlantısı kurabilmesi için IInkCollectorEvents'a bir işaretçi alır.
// Set up connection between sink and InkCollector
HRESULT AdviseInkCollector(
IInkCollector *pIInkCollector)
{
// Get the connection point container
IConnectionPointContainer *pIConnectionPointContainer;
HRESULT hr = pIInkCollector->QueryInterface(IID_IConnectionPointContainer, (void **) &pIConnectionPointContainer);
if (FAILED(hr))
...
// Find the connection point for Ink Collector events
hr = pIConnectionPointContainer->FindConnectionPoint(__uuidof(_IInkCollectorEvents), &m_pIConnectionPoint);
if (SUCCEEDED(hr))
{
// Hook up sink to connection point
hr = m_pIConnectionPoint->Advise(this, &m_dwCookie);
}
if (FAILED(hr))
...
// Don't need the connection point container any more.
pIConnectionPointContainer->Release();
return hr;
}
UnadviseInkCollector yöntemi, nesnenin denetimle olan bağlantılarını serbest bırakır.
// Remove the connection of the sink to the Ink Collector
HRESULT UnadviseInkCollector()
{
HRESULT hr = m_pIConnectionPoint->Unadvise(m_dwCookie);m_pIConnectionPoint->Release();
m_pIConnectionPoint = NULL;
return hr;
}
Mürekkep Toplayıcı için Olay İşleyicisi Tanımlama
CMyInkEvents Sınıfı, InkCollectorEvents Sınıfının Stroke olay işleyicisinin varsayılan davranışını geçersiz kılar. InkCollector bir Stroke olayı aldığında, Stroke yöntemi bir ileti kutusu görüntüler.
class CMyInkEvents : public InkCollectorEvents
{
public:
// Event: Stroke
virtual void Stroke(
IInkCursor* Cursor,
IInkStrokeDisp* Stroke,
VARIANT_BOOL *Cancel)
{
// Demonstrate that the event notification was received.
MessageBox(m_hWnd, "Stroke Event", "Event Received", MB_OK);
}
CMyInkEvents()
{
m_hWnd = NULL;
}
HRESULT Init(
HWND hWnd)
{
m_hWnd = hWnd;
return InkCollectorEvents::Init();
}
HWND m_hWnd;
};
Mürekkep Toplayıcı Sarmalayıcısı Tanımlama
CMyInkCollector Sınıfının Init yöntemi bir CMyInkEvents nesnesi bildirir ve başlatır. Daha sonra bir InkCollector nesnesi oluşturur ve mürekkep toplayıcısını ve olay işleyicisini ilişkilendirir. Son olarak, InkCollector pencereye eklenir ve etkinleştirilir.
// Handle all initialization
HRESULT Init(
HWND hWnd)
{
// Initialize event sink. This consists of setting
// up the free threaded marshaler.
HRESULT hr = m_InkEvents.Init(hWnd);
if (FAILED(hr))
...
// Create the ink collector
hr = CoCreateInstance(CLSID_InkCollector, NULL, CLSCTX_ALL, IID_IInkCollector, (void **) &m_pInkCollector);
if (FAILED(hr))
...
// Set up connection between Ink Collector and our event sink
hr = m_InkEvents.AdviseInkCollector(m_pInkCollector);
if (FAILED(hr))
...
// Attach Ink Collector to window
hr = m_pInkCollector->put_hWnd((long) hWnd);
if (FAILED(hr))
...
// Allow Ink Collector to receive input.
return m_pInkCollector->put_Enabled(VARIANT_TRUE);
}
Tablet PC Arabirimlerine ve Sarmalayıcı Sınıflarına Erişme
İlk olarak, Tablet PC Otomasyonu arabirimleri için üst bilgileri ekleyin. Bunlar Microsoft<entity type="reg"/> Windows<entity type="reg"/> XP Tablet PC Edition Development Kit 1.7 ile yüklenir.
#include <msinkaut.h>
#include <msinkaut_i.c>
Ardından, sarmalayıcı sınıflar için başlıkları ekleyin ve InkCollector olay işleyicisinin tanımlandığını belirtin.
#include "TpcConpt.h"
#include "EventSink.h"
Sarmalayıcı Sınıflarını Çağırma
Pencere oluşturulduğunda, Pencere işlemi bir mürekkep toplayıcı sarmalayıcı oluşturur ve sarmalayıcıyı başlatır. Pencere yok edildiğinde, pencere işlevi mürekkep toplayıcı sarmalayıcısını siler. Mürekkep toplayıcı kapsayıcı, ilişkili olay işleyicisinin oluşturulmasını ve silinmesini yönetir.
case WM_CREATE:
// Allocate and initialize memory for object
pmic = new CMyInkCollector();
if (pmic != NULL)
{
// Real initialization. This consists of creating
// an ink collector object and attaching it to
// the current window.
if (SUCCEEDED(pmic->Init(hWnd)))
{
return 0;
}
// Failure free resources.
delete pmic;
pmic = NULL;
}
return -1;
...
case WM_DESTROY:
// The destructor for the object handles releasing the
// InkCollector and disconnecting the InkCollector
// from the object's event sink.
delete pmic;
pmic = NULL;
PostQuitMessage(0);
break;