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 方法 方法所使用的封包。
如果您修改封包, 則 cPropCountPerPkt是 ppInOutPkt中的 LONG 數目,必須由目前所需的封包屬性 (DPP) 在目前輸入裝置上顯示。
您可以藉由更新 cPropCountPerPkt 和 ppInOutPkts 參數來修改封包。 將 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 |
另請參閱
IStylusPlugin 介面