次の方法で共有


IStylusPlugin::StylusDown メソッド (rtscom.h)

タブレット ペンがデジタイザーサーフェスに触れたことを実装するプラグインに通知します。

構文

HRESULT StylusDown(
  [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 を呼び出す StylusDown メソッドを実装して、X、Y データの値を変更して、指定した四角形内に収まるようにします。 これは、C# サンプル RealTimeStylus プラグイン サンプルに実装されているのと同じ機能です。 2 番目のコード スニペットは ModifyPacket 関数です。

STDMETHODIMP CPacketModifier::StylusDown( 
            /* [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

関連項目

IStylusAsyncPlugin

IStylusPlugin インターフェイス

IStylusSyncPlugin

RealTimeStylus リファレンス