IStrokeBuilder
COM公式ドキュメント
パケットデータからプログラムによってストロークを作成するために使用するインターフェイスです。
解説(Remarks)
このインターフェイスは StrokeBuilder Class によって実装されます。
StrokeBuilder Class は、データを自分で管理するアプリケーション向けに、ストロークを作成するもう 1 つの方法を提供します。このクラスには、StylusDown、Packets、StylusUp の各通知から呼び出せるメソッドが用意されています。
次の 2 つのモデルがサポートされます。
- IStrokeBuilder::CreateStroke Method メソッドを使用して、カスタムのストローク情報をアトミックにストロークへ変換する方法。
- StylusDown、Packets、StylusUp の各通知に対応する IStrokeBuilder::BeginStroke Method、IStrokeBuilder::AppendPackets Method、IStrokeBuilder::EndStroke Method の各メソッドを使用してストロークを構築する方法。
例
次の 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。
RealTimeStylus Class オブジェクトから送られたパケットデータを使用して、インク オブジェクト上にストロークを作成します。
| cPktBuffLength | DWORD | in | pPackets 配列に含まれる LONG の個数です。バイト単位のサイズではありません。有効な値は 0 以上 0x000FFFFF 以下です。 |
| pPackets | INT* | in | パケットデータの先頭を指すポインターです。 |
| cPacketProperties | DWORD | in | pPacketProperties バッファー内の long の個数です。これはパケット数にプロパティ数を掛けた値です。有効な値は 0 以上 32 以下です。 |
| pPacketProperties | PACKET_PROPERTY* | in | パケットのプロパティを格納したバッファーです。 |
| fInkToDeviceScaleX | FLOAT | in | インク空間からデジタイザー座標への、水平方向 (x 軸) の変換係数です。 |
| fInkToDeviceScaleY | FLOAT | in | インク空間からデジタイザー座標への、垂直方向 (y 軸) の変換係数です。 |
| ppIInkStroke | IInkStrokeDisp** | inout | 新しく作成されたストロークを指すポインターです。この値は NULL でもかまいません。 |
戻り値
戻り値の説明については、RealTimeStylus Classes and Interfaces を参照してください。
解説(Remarks)
fInkToDeviceScaleX パラメーターと fInkToDeviceScaleY パラメーターは、IStrokeBuilder::CreateStroke Method メソッドで作成されるストロークの内部表現に影響します。インク空間の x 座標に fInkToDeviceScaleX を掛けると、デジタイザー単位の x 座標が得られます。インク空間の y 座標に fInkToDeviceScaleY を掛けると、デジタイザー単位の y 座標が得られます。
スケールのパラメーターを取得するには、IRealTimeStylus::GetPacketDescriptionData Method を使用します。
RealTimeStylus Class オブジェクトからのパケットデータを使用して、インク オブジェクト上でストロークを開始します。
| tcid | DWORD | in | タブレット コンテキスト識別子です。 |
| sid | DWORD | in | スタイラス識別子です。 |
| pPacket | INT* | in | パケットデータの先頭です。読み取り専用です。 |
| cPacketProperties | DWORD | in | pPacketProperties バッファー内の LONG の個数です。これはパケット数にプロパティ数を掛けた値です。 |
| pPacketProperties | PACKET_PROPERTY* | in | パケットのプロパティを格納したバッファーです。 |
| fInkToDeviceScaleX | FLOAT | in | インク空間からデジタイザー座標への、水平方向 (x 軸) の変換係数です。 |
| fInkToDeviceScaleY | FLOAT | in | インク空間からデジタイザー座標への、垂直方向 (y 軸) の変換係数です。 |
| ppIInkStroke | IInkStrokeDisp** | 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;
}
デジタイザー入力パケット リストの末尾にパケットを追加します。
| tcid | DWORD | in | スタイラスが属するタブレット デバイスのコンテキスト識別子です。 |
| sid | DWORD | in | スタイラス オブジェクトの識別子です。 |
| cPktBuffLength | DWORD | in | pPackets 配列に含まれる LONG の個数です。バイト単位のサイズではありません。有効な値は 0 以上 0x7FFF 以下です。 |
| pPackets | INT* | in | パケットデータの先頭です。読み取り専用です。 |
戻り値
戻り値の説明については、RealTimeStylus Classes and Interfaces を参照してください。
解説(Remarks)
このメソッドは、スタイラスがデジタイザーに触れている状態、または検出範囲内にある状態で移動した結果としてデータ パケットが送信されたときに呼び出します。
例
次の 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);
}
ストロークを終了し、ストローク オブジェクトを返します。
| tcid | DWORD | in | タブレット コンテキスト識別子です。 |
| sid | DWORD | in | スタイラス識別子です。 |
| ppIInkStroke | IInkStrokeDisp** | inout | 新しいストロークを指すポインターです。この値は NULL でもかまいません。 |
| pDirtyRect | RECT* | inout | タブレットのダーティな (変更された) 四角形です。この値は NULL でもかまいません。 |
戻り値
戻り値の説明については、RealTimeStylus Classes and Interfaces を参照してください。
解説(Remarks)
ダーティ領域とは、変更が加えられたタブレット上の範囲を表します。
例
次の C++ の例は、IStylusPlugin Interface オブジェクトにおける IStylusPlugin::StylusUp Method メソッドの実装を示します。このプラグインは StrokeBuilder オブジェクトを使用して、新しいインク ストロークを作成します。IStrokeBuilder::EndStroke Method メソッドは、ストロークの構築を完了して StrokeBuilder Class の Ink オブジェクトに追加するために 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);
}
IStrokeBuilder オブジェクトに関連付けられているインク オブジェクトを取得または設定します。
| ppiInkObj | IInkDisp** | out | ストロークが追加されるインクオブジェクトを表す IInkDisp へのポインタを受け取る出力ポインタである。 |
| piInkObj | IInkDisp* | inoptional | ストロークの追加先として設定するインクオブジェクトを表す IInkDisp へのポインタである。 |
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 指定が可能。#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,sptr,int,sptr,float,float,sptr #comfunc global IStrokeBuilder_BeginStroke 4 int,int,sptr,int,sptr,float,float,sptr #comfunc global IStrokeBuilder_AppendPackets 5 int,int,int,sptr #comfunc global IStrokeBuilder_EndStroke 6 int,int,sptr,sptr #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から自動取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。