共用方式為


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

StylusInfo 結構,其中包含與手寫筆相關聯的 RTS 相關資訊。

[in] cPropCountPerPkt

每個封包的屬性數目。 有效值為 0 到 32,包含。

[in] pPacket

封包資料的開頭。

[in, out] ppInOutPkt

已修改手寫筆資料封包的指標。 外掛程式可以使用此參數,將修改過的封包資料摘要至下游封包。 Null以外的值表示封包已修改,RTS 會使用pPacket參數將此資料傳送至外掛程式。

傳回值

如需傳回值的描述, RealTimeStylus 類別和介面

備註

您可以在緩衝區 ppInOutPkt中傳回已修改封包的陣列。 IStylusPlugin::StylusUp 方法IStylusPlugin::StylusDown 方法方法所使用的封包只能變更。 可以刪除 IStylusPlugin::P ackets 方法和IStylusPlugin::InAirPackets 方法 方法所使用的封包。

如果您修改封包, 則 cPropCountPerPktppInOutPkt中的 LONG 數目,必須由目前所需的封包屬性 (DPP) 在目前輸入裝置上顯示。

您可以藉由更新 cPropCountPerPktppInOutPkts 參數來修改封包。 將 cPropCountPerPkt 變更為有效的封包屬性計數,並將 ppInOutPkts 變更為每個封包中每個 DPP 值的有效資料緩衝區指標。 IStylusPlugin::StylusUp 方法IStylusPlugin::StylusDown 方法只能有一個封包存在。

例如,如果您新增三個封包,而 DPP 目前為 X、Y 和 Pressure,則您必須在此緩衝區中有九個 LONG 值,並將 cPropCountPerPkt 設定為 9。

cPropCountPerPkt值有助於厘清針對 NewPackets 事件事件等事件所出現之整數一般陣列中的封包之間的界限。 封包可以搭配使用資料傳輸更有效率,因此不需要每個封包呼叫外掛程式一次。

範例

下列 C++ 程式碼範例會實作 StylusDown 方法,以呼叫 Helper 函式 ModifyPacket來變更 X,Y 資料的值,使其落在指定的矩形內。 這是 C# 範例 RealTimeStylus 外掛程式範例中所實作的相同功能。 第二個程式碼片段是 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 參考