이 프로그램은 C++만 사용하여 InkCollector 이벤트를 캡처하는 애플리케이션을 빌드하는 방법을 보여 줍니다. 이 프로그램은 InkCollector 개체를 함께 만들어 창 -enable 잉크로 만듭니다. Stroke 이벤트가 수신될 때마다 메시지 상자가 표시됩니다.
잉크 수집기 이벤트를 위한 래퍼 정의
InkCollectorEvents
클래스는 잉크 수집기에서 이 클래스의 사용자에게 잉크 수집기 이벤트를 전달하는 작업을 처리합니다.
AdviseInkCollector
메서드는 InkCollector 개체와 이 클래스 간의 연결을 설정합니다.
Invoke
메서드는 IDispatch 이벤트 알림을 이 클래스의 사용자가 특정 이벤트를 처리하기 위해 재정의할 수 있는 가상 함수 호출로 변환합니다.
메모
해당 이벤트를 얻으려면 이벤트 처리기에 대한 가상 함수를 재정의하는 것 이상을 수행해야 합니다. 기본 이벤트를 제외한 모든 이벤트의 경우 잉크 수집기의 SetEventInterest 메서드를 호출하여 이벤트 가져오기를 보장해야 합니다. 둘째, 이 개체는 자유 스레드를 마샬링하므로 구현된 모든 이벤트 처리기도 자유 스레드여야 합니다. 특히 중요한 것은 Windows API를 사용하는 것입니다. 이 경우 이벤트 처리기가 잉크 수집기와 연결된 창과 동일한 스레드에서 실행되지 않을 수 있으므로 다른 스레드로 전환할 수 있습니다.
// 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
메서드는 CoCreateFreeThreadedMarshaler 호출하여 자유 스레드 마샬러를 설정합니다.
// Init: set up free threaded marshaller.
HRESULT Init()
{
return CoCreateFreeThreadedMarshaler(this, &m_punkFTM);
}
AdviseInkCollector
메서드는 InkCollector 개체와 이 클래스 간의 연결을 설정합니다. 먼저 잉크 수집기의 연결점을 검색합니다. 그런 다음 컨트롤에 대한 권고 연결을 설정할 수 있도록 IInkCollectorEvents
에 대한 포인터를 얻습니다.
// 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
메서드는 개체가 컨트롤에 있는 연결을 해제합니다.
// 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;
}
잉크 수집기 이벤트 처리기 정의
CMyInkEvents 클래스는 InkCollectorEvents 클래스의 Stroke 이벤트 처리기의 기본 동작을 재정의합니다. Stroke 메서드는 InkCollector가에서 Stroke 이벤트를 받을 때 메시지 상자를 표시합니다.
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;
};
잉크 수집기 포장 정의
CMyInkCollector 클래스의 Init 메서드는 CMyInkEvents 개체를 선언하고 초기화합니다. 그런 다음 InkCollector 개체를 만들고 잉크 수집기와 이벤트 처리기를 연결합니다. 마지막으로 InkCollector 창에 연결되고 사용하도록 설정됩니다.
// 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);
}
태블릿 PC 인터페이스와 래퍼 클래스에 액세스하기
먼저 태블릿 PC 자동화 인터페이스에 대한 헤더를 포함합니다. Microsoft<엔터티 유형="reg"/> Windows<엔터티 유형="reg"/> XP Tablet PC Edition Development Kit 1.7과 함께 설치됩니다.
#include <msinkaut.h>
#include <msinkaut_i.c>
그런 다음 래퍼 클래스에 대한 헤더를 포함하고 InkCollector 이벤트 처리기가 정의되었습니다.
#include "TpcConpt.h"
#include "EventSink.h"
래퍼 클래스 호출
창이 생성될 때, 윈도우 절차에서는 잉크 수집기 래퍼를 생성하고 래퍼를 초기화합니다. 창이 제거되면 Window 프로시저는 잉크 수집기 래퍼를 삭제합니다. 잉크 수집기 래퍼 객체는 연결된 이벤트 처리기의 생성 및 삭제를 처리합니다.
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;