IStylusPlugin::P ackets メソッド (rtscom.h)
タブレット ペンがデジタイザー上を移動していることをプラグインを実装するオブジェクトに通知します。
構文
HRESULT Packets(
[in] IRealTimeStylus *piRtsSrc,
[in] const StylusInfo *pStylusInfo,
[in] ULONG cPktCount,
[in] ULONG cPktBuffLength,
[in] LONG *pPackets,
[in, out] ULONG *pcInOutPkts,
[in, out] LONG **ppInOutPkts
);
パラメーター
[in] piRtsSrc
通知を送信した RealTimeStylus クラス オブジェクト。
[in] pStylusInfo
ペンに関連付けられている RTS に関する情報を含む StylusInfo 構造体 。
[in] cPktCount
データ パケットあたりのプロパティの数。
[in] cPktBuffLength
pPackets が指すバッファーの長さ (バイト単位)。 各パケットによって占有されるメモリは (cPktBuffLength / cPktCount) です。 有効な値は、0 ~ 0x7FFFです(両端を含む)。
[in] pPackets
パケット データの先頭へのポインター。
[in, out] pcInOutPkts
ppInOutPkt 内の LONG の数。
[in, out] ppInOutPkts
変更されたスタイラス データ パケットの配列へのポインター。 プラグインでは、このパラメーターを使用して、変更されたパケット データをダウンストリーム パケットにフィードできます。 NULL 以外の値は、RTS が pPacket パラメーターを使用してこのデータをプラグインに送信することを示します。
戻り値
戻り値の説明については、「 RealTimeStylus クラスとインターフェイス」を参照してください。
注釈
ペンが動き、デジタイザーサーフェスに触れているときに発生します。 この通知を使用して、指定した四角形内のパケット データを制限します。 IStylusPlugin::P ackets メソッドと IStylusPlugin::InAirPackets メソッドメソッドで使用されるパケットは削除できます。
ppInOutPkt パラメーターを使用して、変更されたパケットの配列を返すことができます。
パケットは、パケットごとに 1 回呼び出す必要がないように、データ転送をより効率的にするためにバンドルできます。 IStylusPlugin::InAirPackets メソッド と IStylusPlugin::P ackets メソッド は、1 つ以上のパケットを送信できます。
例
次の C++ コード例では、パケットを四角形に拘束するように X,Y データを変更する IStylusPlugin::P ackets メソッドを 実装します。 これは、 RealTimeStylus プラグイン サンプルの C# で実装されているのと同じ機能です。
STDMETHODIMP CPacketModifier::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)
{
BOOL fModified = FALSE; // Did we change the packet data?
ULONG cPropertyCount = cPktBuffLength/cPktCount; // # of properties in a packet
ULONG iOtherProps = 0; // Properties other than X and Y
// Allocate memory for modified packets
LONG* pTempOutPkts = (LONG*)CoTaskMemAlloc(sizeof(ULONG)*cPktBuffLength);
// For each packet in the packet data, check whether
// its X,Y values fall outside of the specified rectangle.
// If so, replace them with the nearest point that still
// falls within the rectangle.
for (ULONG i = 0; i < cPktCount; i += cPropertyCount)
{
// Packet data always has X followed by Y
// followed by the rest
LONG x = pPackets[i];
LONG y = pPackets[i+1];
// Constrain points to the input rectangle
x = (x < m_filterRect.left ? m_filterRect.left : x);
x = (x > m_filterRect.right ? m_filterRect.right : x);
y = (y < m_filterRect.top ? m_filterRect.top : y);
y = (y > m_filterRect.bottom ? m_filterRect.bottom : y);
// If necessary, modify the X,Y packet data
if ((x != pPackets[i]) || (y != pPackets[i+1]))
{
pTempOutPkts[i] = x;
pTempOutPkts[i+1] = y;
iOtherProps = i+2;
// Copy the properties that we haven't modified
while (iOtherProps < (i + cPropertyCount))
{
pTempOutPkts[iOtherProps] = pPackets[iOtherProps++];
}
fModified = TRUE;
}
}
if (fModified)
{
// Set the [out] pointer to the
// memory we allocated and updated
*ppInOutPkts = pTempOutPkts;
*pcInOutPkts = cPktCount;
}
else
{
// Nothing modified, release the memory we allocated
CoTaskMemFree(pTempOutPkts);
}
return S_OK;
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP Tablet PC Edition [デスクトップ アプリのみ] |
サポートされている最小のサーバー | サポートなし |
対象プラットフォーム | Windows |
ヘッダー | rtscom.h |
[DLL] | RTSCom.dll |
こちらもご覧ください
IStylusPlugin インターフェイス