IStylusPlugin::StylusUp メソッド (rtscom.h)
ユーザーがタブレット デジタイザー画面からタブレット ペンを上げたことを実装プラグインに通知します。
構文
HRESULT StylusUp(
[in] IRealTimeStylus *piRtsSrc,
[in] const StylusInfo *pStylusInfo,
[in] ULONG cPropCountPerPkt,
[in] LONG *pPacket,
[in, out] LONG **ppInOutPkt
);
パラメーター
[in] piRtsSrc
通知を送信した RealTimeStylus クラス (RTS) オブジェクト。
[in] pStylusInfo
ペンに関連付けられている RTS に関する情報を含む StylusInfo 構造体 。
[in] cPropCountPerPkt
パケットあたりのプロパティの数。 有効な値は、0 ~ 32 です。
[in] pPacket
パケット データの開始。
[in, out] ppInOutPkt
変更されたスタイラス データ パケットへのポインター。 プラグインでは、このパラメーターを使用して、変更されたパケット データをダウンストリーム パケットにフィードできます。 NULL 以外の値は、パケットが変更されたことを示し、RTS は pPacket パラメーターを使用してこのデータをプラグインに送信します。
戻り値
戻り値の説明については、「 RealTimeStylus クラスとインターフェイス」を参照してください。
注釈
このメソッドは、ペンがデジタイザーサーフェスから離れるときに使用されます。
変更されたパケットの配列をバッファー ppInOutPkt に返すことができます。 IStylusPlugin::StylusUp メソッドと IStylusPlugin::StylusDown メソッドメソッドで使用されるパケットは、変更することしかできません。 これらは削除できません。 IStylusPlugin::P ackets メソッドと IStylusPlugin::InAirPackets メソッドメソッドで使用されるパケットは削除できます。
パケットを変更する場合、 cPropCountPerPkt ( ppInOutPkt 内の LONG の数) は、現在の入力デバイスで使用可能な現在の目的のパケット プロパティ (DPP) によって割り切れる必要があります。
パケットを変更するには、 cPropCountPerPkt パラメーターと ppInOutPkts パラメーターを 更新します。 cPropCountPerPkt を有効な合計パケット プロパティ数に変更し、ppInOutPkts を各パケット内の各 DPP の値を計算する有効なデータ バッファーに変更します。 IStylusPlugin::StylusUp メソッドと IStylusPlugin::StylusDown メソッドのその場所に存在できるパケットは 1 つだけです。
たとえば、3 つのパケットを追加し、DPP が現在 X、Y、および Pressure である場合、このバッファーには 9 つの LONG 値が含まれており、 cPropCountPerPkt を 9 に設定する必要があります。
cPropCountPerPkt 値は、NewPackets イベント イベントなどのイベントに含まれる整数のフラット配列内のパケット間の境界を明確にするのに役立ちます。 パケットは、パケットごとにプラグが 1 回呼び出される必要がないように、データ転送の効率を高めるためにバンドルできます。
例
次の C++ コード例では、ヘルパー関数 ModifyPacket を呼び出して X、Y データの値を変更し、指定した四角形内に収まるようにする StylusUp メソッドを実装します。 これは、C# サンプル RealTimeStylus プラグイン サンプルに実装されているのと同じ機能です。 2 番目のコード スニペットは ModifyPacket 関数です。
STDMETHODIMP CPacketModifier::StylusUp(
/* [in] */ IRealTimeStylus *piRtsSrc,
/* [in] */ const StylusInfo *pStylusInfo,
/* [in] */ ULONG cPropCountPerPkt,
/* [size_is][in] */ LONG *pPacket,
/* [out][in] */ LONG **ppInOutPkt)
{
return ModifyPacket(cPropCountPerPkt, pPacket, ppInOutPkt);
}
// Helper method to modify a single packet
// Called from StylusDown() and StylusUp()
HRESULT CPacketModifier::ModifyPacket(
/* [in] */ ULONG cPropCountPerPkt,
/* [size_is][in] */ LONG *pPacket,
/* [out][in] */ LONG **ppInOutPkt)
{
// Pointer to a buffer to hold changed packet values
LONG* pTempOutPkt = NULL;
// X and Y come first (0 and 1),
// other properties follow
ULONG iOtherProps = 2;
if (cPropCountPerPkt > 0)
{
pTempOutPkt = (LONG*)CoTaskMemAlloc(sizeof(LONG)*cPropCountPerPkt);
if (NULL != pTempOutPkt)
{
// Packet data always has x followed by y followed by the rest.
LONG x = pPacket[0];
LONG y = pPacket[1];
// 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.
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 != pPacket[0]) || (y != pPacket[1]))
{
pTempOutPkt[0] = x;
pTempOutPkt[1] = y;
// Copy the properties that we haven't modified
while (iOtherProps < cPropCountPerPkt)
{
pTempOutPkt[iOtherProps] = pPacket[iOtherProps++];
}
*ppInOutPkt = pTempOutPkt;
}
else
{
CoTaskMemFree(pTempOutPkt);
}
}
}
return S_OK;
}
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP Tablet PC Edition [デスクトップ アプリのみ] |
サポートされている最小のサーバー | サポートなし |
対象プラットフォーム | Windows |
ヘッダー | rtscom.h |
[DLL] | RTSCom.dll |