IStylusPlugin::StylusDown 方法 (rtscom.h)
通知实现插件平板电脑触控笔已触摸数字化器表面。
语法
HRESULT StylusDown(
[in] IRealTimeStylus *piRtsSrc,
[in] const StylusInfo *pStylusInfo,
[in] ULONG cPropCountPerPkt,
[in] LONG *pPacket,
[in, out] LONG **ppInOutPkt
);
parameters
[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) 在当前输入设备上可用来删除。
可以通过更新 cPropCountPerPkt 和 ppInOutPkts 参数来修改数据包。 将 cPropCountPerPkt 更改为有效的总数据包属性计数,并将 ppInOutPkts 更改为指向有效数据缓冲区的指针,该缓冲区考虑每个数据包中每个 DPP 的值。 对于 IStylusPlugin::StylusUp 方法和 IStylusPlugin::StylusDown 方法,该位置只能存在一个数据包。
例如,如果添加三个数据包,并且 DPP 当前为 X、Y 和 Pressure,则此缓冲区中必须具有 9 个 LONG 值,并将 cPropCountPerPkt 设置为 9。
cPropCountPerPkt 值有助于阐明平面整数数组中传入事件(例如 NewPackets 事件)的数据包之间的边界。 可以捆绑数据包,以便更高效地进行数据传输,这样就不需要每个数据包调用一次插件。
示例
以下 C++ 代码示例实现 一个 StylusDown 方法,该方法调用帮助程序函数 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 |
请参阅
IStylusPlugin 接口