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;