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

一个 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 方法 使用的数据包。

如果修改数据包,则 cPropCountPerPkt(即 ppInOutPkt 中的 LONG 数)必须被当前所需的数据包属性 (DPP) 在当前输入设备上可用来删除。

通过更新 cPropCountPerPktppInOutPkts 参数来修改数据包。 将 cPropCountPerPkt 更改为有效的总数据包属性计数,将 ppInOutPkt 更改为 考虑每个数据包中每个 DPP 的值的有效数据缓冲区。 对于 IStylusPlugin::StylusUp 方法和 IStylusPlugin::StylusDown 方法,该位置只能存在一个数据包。

例如,如果添加三个数据包,并且 DPP 当前为 X、Y 和 Pressure,则此缓冲区中必须具有 9 个 LONG 值,并将 cPropCountPerPkt 设置为 9。

cPropCountPerPkt 值有助于阐明平面整数数组中传入事件(例如 NewPackets 事件)的数据包之间的边界。 可以捆绑数据包,以便更高效地进行数据传输,这样就不需要为每个数据包调用一次插件。

示例

以下 C++ 代码示例实现 一个 StylusUp 方法,该方法调用帮助程序函数 ModifyPacket 来更改 X,Y 数据的值,使其位于指定的矩形中。 此功能与 C# 示例 RealTimeStylus 插件示例中实现的功能相同。 第二个代码片段是 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

另请参阅

IStylusAsyncPlugin

IStylusPlugin 接口

IStylusSyncPlugin

RealTimeStylus 类