Sampel Sink Peristiwa C++
Program ini menunjukkan bagaimana Anda dapat membangun aplikasi yang menangkap peristiwa InkCollector hanya menggunakan C++. Program ini membuat bersama objek InkCollector ke tinta -aktifkan jendela. Ini menampilkan kotak pesan setiap kali peristiwa Stroke diterima.
Menentukan Pembungkus untuk Peristiwa Pengumpul Tinta
Kelas InkCollectorEvents
menangani peristiwa kolektor tinta yang diteruskan dari pengumpul tinta kepada pengguna kelas ini. Metode AdviseInkCollector
ini menyiapkan koneksi antara objek InkCollector dan kelas ini. Metode ini Invoke
mengonversi pemberitahuan peristiwa IDispatch menjadi panggilan ke fungsi virtual yang dapat diambil alih pengguna kelas ini untuk memproses peristiwa tertentu.
Catatan
Anda harus melakukan lebih dari mengambil alih fungsi virtual agar penanganan aktivitas mendapatkan peristiwa tersebut. Untuk semua peristiwa kecuali default, Anda harus memanggil metode SetEventInterest kolektor tinta untuk menjamin mendapatkan peristiwa. Kedua, objek ini marshals sendiri utas bebas sehingga semua penanganan peristiwa yang diimplementasikan juga perlu bebas utas. Kepentingan tertentu adalah menggunakan API Windows, yang dapat menyebabkan peralihan ke utas lain karena penanganan aktivitas tidak dijamin berjalan pada utas yang sama dengan jendela yang terhubung dengan pengumpul tinta.
// 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;
}
...
Metode ini Init
memanggil CoCreateFreeThreadedMarshaler untuk menyiapkan marshaler utas gratis.
// Init: set up free threaded marshaller.
HRESULT Init()
{
return CoCreateFreeThreadedMarshaler(this, &m_punkFTM);
}
Metode AdviseInkCollector
ini menyiapkan koneksi antara objek InkCollector dan kelas ini. Ini pertama-tama mengambil titik koneksi ke pengumpul tinta. Kemudian mengambil pointer ke IInkCollectorEvents
sehingga dapat membuat koneksi penasihat ke kontrol.
// 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;
}
Metode UnadviseInkCollector
ini merilis koneksi yang dimiliki objek ke kontrol.
// 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;
}
Menentukan Handler Peristiwa Kolektor Tinta
Kelas CMyInkEvents mengambil alih perilaku default penanganan aktivitas Stroke dari Kelas InkCollectorEvents. Metode Stroke menampilkan kotak pesan ketika InkCollector menerima peristiwa 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;
};
Menentukan Pembungkus Kolektor Tinta
Metode Init Kelas CMyInkCollector menyatakan dan menginisialisasi objek CMyInkEvents. Kemudian membuat objek InkCollector dan mengaitkan pengumpul tinta dan penanganan aktivitas. Akhirnya, InkCollector dilampirkan ke jendela dan diaktifkan.
// 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);
}
Mengakses Antarmuka PC Tablet dan Kelas Pembungkus
Pertama, sertakan header untuk antarmuka Automation PC Tablet. Ini diinstal dengan entitas Microsoft<type="reg"/> Windows<entity type="reg"/> XP Tablet PC Edition Development Kit 1.7.
#include <msinkaut.h>
#include <msinkaut_i.c>
Kemudian, sertakan header untuk kelas pembungkus dan penanganan aktivitas InkCollector ditentukan.
#include "TpcConpt.h"
#include "EventSink.h"
Memanggil Kelas Pembungkus
Saat jendela dibuat, prosedur Jendela membuat pembungkus kolektor tinta dan menginisialisasi pembungkus. Ketika jendela dihancurkan, prosedur Jendela menghapus pembungkus pengumpul tinta. Pembungkus pengumpul tinta menangani pembuatan dan penghapusan penanganan aktivitas terkait.
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;
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk