Win32 API 日本語リファレンス
ホームUI.TabletPC › IStrokeBuilder

IStrokeBuilder

COM
IIDa5fd4e2d-c44b-4092-9177-260905eb672b継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

パケットデータからプログラムによってストロークを作成するために使用するインターフェイスです。

解説(Remarks)

このインターフェイスは StrokeBuilder Class によって実装されます。

StrokeBuilder Class は、データを自分で管理するアプリケーション向けに、ストロークを作成するもう 1 つの方法を提供します。このクラスには、StylusDownPacketsStylusUp の各通知から呼び出せるメソッドが用意されています。

次の 2 つのモデルがサポートされます。

次の C++ の例は、IStylusPlugin Interface クラスの部分的な実装を示します。このプラグインは StrokeBuilder オブジェクトを使用して、新しいインク ストロークを作成します。

// CStrokeBuilderPlugin

// Helper functions
HRESULT CStrokeBuilderPlugin::GetInk(IInkDisp** pInk)
{
    return m_pStrokeBuilder->get_Ink(pInk);
}

// IStylusAsyncPlugin Interface implementation

STDMETHODIMP CStrokeBuilderPlugin::RealTimeStylusEnabled( 
            /* [in] */ IRealTimeStylus *piRtsSrc,
            /* [in] */ ULONG cTcidCount,
            /* [size_is][in] */ const TABLET_CONTEXT_ID *pTcids)
{
    // Create an IStrokeBuilder object
    return CoCreateInstance(CLSID_StrokeBuilder, NULL, CLSCTX_INPROC, IID_IStrokeBuilder, (VOID **)&m_pStrokeBuilder);
}

STDMETHODIMP CStrokeBuilderPlugin::DataInterest( 
            /* [retval][out] */ RealTimeStylusDataInterest *pDataInterest)
{
    // Set up the messages we want to receive
    *pDataInterest = (RealTimeStylusDataInterest)(RTSDI_StylusDown | RTSDI_Packets |
                                                  RTSDI_StylusUp | RTSDI_Error);
    return S_OK;
}

STDMETHODIMP CStrokeBuilderPlugin::StylusDown( 
            /* [in] */ IRealTimeStylus *piRtsSrc,
            /* [in] */ const StylusInfo *pStylusInfo,
            /* [in] */ ULONG cPropCountPerPkt,
            /* [size_is][in] */ LONG *pPacket,
            /* [out][in] */ LONG **ppInOutPkt)
{
    FLOAT fInkToDeviceScaleX;
    FLOAT fInkToDeviceScaleY;
    ULONG cPacketProperties;
    PACKET_PROPERTY* pPacketProperties;

    // Get the info we need to call BeginStroke
    HRESULT hr = piRtsSrc->GetPacketDescriptionData(pStylusInfo->tcid, &fInkToDeviceScaleX, &fInkToDeviceScaleY, 
                                                    &cPacketProperties, &pPacketProperties);

    if (SUCCEEDED(hr))
    {
        // Start creating the stroke
        hr = m_pStrokeBuilder->BeginStroke(pStylusInfo->tcid, pStylusInfo->cid, pPacket, cPropCountPerPkt, 
                                            pPacketProperties, fInkToDeviceScaleX, fInkToDeviceScaleY, &m_piStroke);
    }
    
    return hr;
}

STDMETHODIMP CStrokeBuilderPlugin::Packets( 
            /* [in] */ IRealTimeStylus *piRtsSrc,
            /* [in] */ const StylusInfo *pStylusInfo,
            /* [in] */ ULONG cPktCount,
            /* [in] */ ULONG cPktBuffLength,
            /* [size_is][in] */ LONG *pPackets,
            /* [out][in] */ ULONG *pcInOutPkts,
            /* [out][in] */ LONG **ppInOutPkts)
{
    // Add packet to the stroke
    return m_pStrokeBuilder->AppendPackets(pStylusInfo->tcid, pStylusInfo->cid, cPktBuffLength, pPackets);
}

STDMETHODIMP CStrokeBuilderPlugin::StylusUp( 
            /* [in] */ IRealTimeStylus *piRtsSrc,
            /* [in] */ const StylusInfo *pStylusInfo,
            /* [in] */ ULONG cPropCountPerPkt,
            /* [size_is][in] */ LONG *pPacket,
            /* [out][in] */ LONG **ppInOutPkt)
{
    // Finish the stroke. This adds the stroke to the StrokeBuilder's Ink object.
    return m_pStrokeBuilder->EndStroke(pStylusInfo->tcid, pStylusInfo->cid, &m_piStroke, NULL);
}

STDMETHODIMP CStrokeBuilderPlugin::Error( 
            /* [in] */ IRealTimeStylus *piRtsSrc,
            /* [in] */ IStylusPlugin *piPlugin,
            /* [in] */ RealTimeStylusDataInterest dataInterest,
            /* [in] */ HRESULT hrErrorCode,
            /* [out][in] */ LONG_PTR *lptrKey)
{
    CString strError;
    strError.Format(L"An error occurred. Error code: %d", hrErrorCode);
    TRACE(strError);
    return S_OK;
}

// The remaining interface methods are not used

メソッド 6

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT CreateStroke(DWORD cPktBuffLength, INT* pPackets, DWORD cPacketProperties, PACKET_PROPERTY* pPacketProperties, FLOAT fInkToDeviceScaleX, FLOAT fInkToDeviceScaleY, IInkStrokeDisp** ppIInkStroke)

RealTimeStylus Class オブジェクトから送られたパケットデータを使用して、インク オブジェクト上にストロークを作成します。

cPktBuffLengthDWORDinpPackets 配列に含まれる LONG の個数です。バイト単位のサイズではありません。有効な値は 0 以上 0x000FFFFF 以下です。
pPacketsINT*inパケットデータの先頭を指すポインターです。
cPacketPropertiesDWORDinpPacketProperties バッファー内の long の個数です。これはパケット数にプロパティ数を掛けた値です。有効な値は 0 以上 32 以下です。
pPacketPropertiesPACKET_PROPERTY*inパケットのプロパティを格納したバッファーです。
fInkToDeviceScaleXFLOATinインク空間からデジタイザー座標への、水平方向 (x 軸) の変換係数です。
fInkToDeviceScaleYFLOATinインク空間からデジタイザー座標への、垂直方向 (y 軸) の変換係数です。
ppIInkStrokeIInkStrokeDisp**inout新しく作成されたストロークを指すポインターです。この値は NULL でもかまいません。

戻り値

戻り値の説明については、RealTimeStylus Classes and Interfaces を参照してください。

解説(Remarks)

fInkToDeviceScaleX パラメーターと fInkToDeviceScaleY パラメーターは、IStrokeBuilder::CreateStroke Method メソッドで作成されるストロークの内部表現に影響します。インク空間の x 座標に fInkToDeviceScaleX を掛けると、デジタイザー単位の x 座標が得られます。インク空間の y 座標に fInkToDeviceScaleY を掛けると、デジタイザー単位の y 座標が得られます。

スケールのパラメーターを取得するには、IRealTimeStylus::GetPacketDescriptionData Method を使用します。

vtbl 4 HRESULT BeginStroke(DWORD tcid, DWORD sid, INT* pPacket, DWORD cPacketProperties, PACKET_PROPERTY* pPacketProperties, FLOAT fInkToDeviceScaleX, FLOAT fInkToDeviceScaleY, IInkStrokeDisp** ppIInkStroke)

RealTimeStylus Class オブジェクトからのパケットデータを使用して、インク オブジェクト上でストロークを開始します。

tcidDWORDinタブレット コンテキスト識別子です。
sidDWORDinスタイラス識別子です。
pPacketINT*inパケットデータの先頭です。読み取り専用です。
cPacketPropertiesDWORDinpPacketProperties バッファー内の LONG の個数です。これはパケット数にプロパティ数を掛けた値です。
pPacketPropertiesPACKET_PROPERTY*inパケットのプロパティを格納したバッファーです。
fInkToDeviceScaleXFLOATinインク空間からデジタイザー座標への、水平方向 (x 軸) の変換係数です。
fInkToDeviceScaleYFLOATinインク空間からデジタイザー座標への、垂直方向 (y 軸) の変換係数です。
ppIInkStrokeIInkStrokeDisp**inoutoptional新しいストロークを指すポインターです。この値は NULL でもかまいません。

戻り値

戻り値の説明については、RealTimeStylus Classes and Interfaces を参照してください。

解説(Remarks)

IStrokeBuilder::AppendPackets Method メソッドおよび IStrokeBuilder::EndStroke Method メソッドと組み合わせて使用します。IStrokeBuilder::BeginStroke Method はストロークの構築を開始します。動きが続いて追加のパケットを受信すると、IStrokeBuilder::AppendPackets Method メソッドがその追加のストローク データを追加します。タブレット ペンが面から離され、受信するパケットがなくなると、IStrokeBuilder::EndStroke Method メソッドが呼び出されます。

次の C++ の例は、IStylusPlugin Interface オブジェクトにおける IStylusPlugin::StylusDown Method メソッドの実装を示します。このプラグインは StrokeBuilder オブジェクトを使用して、新しいインク ストロークを作成します。IStrokeBuilder::BeginStroke Method メソッドは、ストロークの構築を開始するために IStylusPlugin::StylusDown Method から呼び出されます。

STDMETHODIMP CStrokeBuilderPlugin::StylusDown( 
            /* [in] */ IRealTimeStylus *piRtsSrc,
            /* [in] */ const StylusInfo *pStylusInfo,
            /* [in] */ ULONG cPropCountPerPkt,
            /* [size_is][in] */ LONG *pPacket,
            /* [out][in] */ LONG **ppInOutPkt)
{
    FLOAT fInkToDeviceScaleX;
    FLOAT fInkToDeviceScaleY;
    ULONG cPacketProperties;
    PACKET_PROPERTY* pPacketProperties;

    // Get the info we need to call BeginStroke
    HRESULT hr = piRtsSrc->GetPacketDescriptionData(pStylusInfo->tcid, &fInkToDeviceScaleX, &fInkToDeviceScaleY, 
                                                    &cPacketProperties, &pPacketProperties);

    if (SUCCEEDED(hr))
    {
        // Start creating the stroke
        hr = m_pStrokeBuilder->BeginStroke(pStylusInfo->tcid, pStylusInfo->cid, pPacket, cPropCountPerPkt, 
                                            pPacketProperties, fInkToDeviceScaleX, fInkToDeviceScaleY, &m_piStroke);
    }
    
    return hr;
}
vtbl 5 HRESULT AppendPackets(DWORD tcid, DWORD sid, DWORD cPktBuffLength, INT* pPackets)

デジタイザー入力パケット リストの末尾にパケットを追加します。

tcidDWORDinスタイラスが属するタブレット デバイスのコンテキスト識別子です。
sidDWORDinスタイラス オブジェクトの識別子です。
cPktBuffLengthDWORDinpPackets 配列に含まれる LONG の個数です。バイト単位のサイズではありません。有効な値は 0 以上 0x7FFF 以下です。
pPacketsINT*inパケットデータの先頭です。読み取り専用です。

戻り値

戻り値の説明については、RealTimeStylus Classes and Interfaces を参照してください。

解説(Remarks)

このメソッドは、スタイラスがデジタイザーに触れている状態、または検出範囲内にある状態で移動した結果としてデータ パケットが送信されたときに呼び出します。

メモ 受信するパケットデータは Himetric 形式であるため、ピクセルに変換する必要があります。

次の C++ の例は、IStylusPlugin Interface オブジェクトにおける IStylusPlugin::Packets Method メソッドの実装を示します。このプラグインは StrokeBuilder オブジェクトを使用して、新しいインク ストロークを作成します。IStrokeBuilder::AppendPackets Method メソッドは、ユーザーがデジタイザー上でスタイラスをドラッグする間、作成中のストロークに新しいパケットデータを追加するために IStylusPlugin::Packets Method から呼び出されます。

STDMETHODIMP CStrokeBuilderPlugin::Packets( 
            /* [in] */ IRealTimeStylus *piRtsSrc,
            /* [in] */ const StylusInfo *pStylusInfo,
            /* [in] */ ULONG cPktCount,
            /* [in] */ ULONG cPktBuffLength,
            /* [size_is][in] */ LONG *pPackets,
            /* [out][in] */ ULONG *pcInOutPkts,
            /* [out][in] */ LONG **ppInOutPkts)
{
    // Add packet to the stroke
    return m_pStrokeBuilder->AppendPackets(pStylusInfo->tcid, pStylusInfo->cid, cPktBuffLength, pPackets);
}
vtbl 6 HRESULT EndStroke(DWORD tcid, DWORD sid, IInkStrokeDisp** ppIInkStroke, RECT* pDirtyRect)

ストロークを終了し、ストローク オブジェクトを返します。

tcidDWORDinタブレット コンテキスト識別子です。
sidDWORDinスタイラス識別子です。
ppIInkStrokeIInkStrokeDisp**inout新しいストロークを指すポインターです。この値は NULL でもかまいません。
pDirtyRectRECT*inoutタブレットのダーティな (変更された) 四角形です。この値は NULL でもかまいません。

戻り値

戻り値の説明については、RealTimeStylus Classes and Interfaces を参照してください。

解説(Remarks)

ダーティ領域とは、変更が加えられたタブレット上の範囲を表します。

次の C++ の例は、IStylusPlugin Interface オブジェクトにおける IStylusPlugin::StylusUp Method メソッドの実装を示します。このプラグインは StrokeBuilder オブジェクトを使用して、新しいインク ストロークを作成します。IStrokeBuilder::EndStroke Method メソッドは、ストロークの構築を完了して StrokeBuilder ClassInk オブジェクトに追加するために IStylusPlugin::StylusUp Method から呼び出されます。

STDMETHODIMP CStrokeBuilderPlugin::StylusUp( 
            /* [in] */ IRealTimeStylus *piRtsSrc,
            /* [in] */ const StylusInfo *pStylusInfo,
            /* [in] */ ULONG cPropCountPerPkt,
            /* [size_is][in] */ LONG *pPacket,
            /* [out][in] */ LONG **ppInOutPkt)
{
    // Finish the stroke. This adds the stroke to the StrokeBuilder's Ink object.
    return m_pStrokeBuilder->EndStroke(pStylusInfo->tcid, pStylusInfo->cid, &m_piStroke, NULL);
}
vtbl 7 HRESULT get_Ink(IInkDisp** ppiInkObj)

IStrokeBuilder オブジェクトに関連付けられているインク オブジェクトを取得または設定します。

ppiInkObjIInkDisp**outストロークが追加されるインクオブジェクトを表す IInkDisp へのポインタを受け取る出力ポインタである。
vtbl 8 HRESULT putref_Ink(IInkDisp* piInkObj)
piInkObjIInkDisp*inoptionalストロークの追加先として設定するインクオブジェクトを表す IInkDisp へのポインタである。
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IStrokeBuilder "{A5FD4E2D-C44B-4092-9177-260905EB672B}"
#usecom global IStrokeBuilder IID_IStrokeBuilder "{E810CEE7-6E51-4CB0-AA3A-0B985B70DAF7}"
#comfunc global IStrokeBuilder_CreateStroke   3 int,var,int,var,float,float,sptr
#comfunc global IStrokeBuilder_BeginStroke    4 int,int,var,int,var,float,float,sptr
#comfunc global IStrokeBuilder_AppendPackets  5 int,int,int,var
#comfunc global IStrokeBuilder_EndStroke      6 int,int,sptr,var
#comfunc global IStrokeBuilder_get_Ink        7 sptr
#comfunc global IStrokeBuilder_putref_Ink     8 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。