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) 在目前輸入裝置上顯示。
您可以藉由更新 cPropCountPerPkt 和 ppInOutPkts 參數來修改封包。 將 cPropCountPerPkt 變更為有效的封包屬性計數, 並將 ppInOutPkts 變更為有效的數據緩衝區,以計算每個封包中每個 DPP 的值。 IStylusPlugin::StylusUp 方法和 IStylusPlugin::StylusDown 方法只能有一個封包存在。
例如,如果您新增三個封包,而 DPP 目前為 X、Y 和 Pressure,則您必須在此緩衝區中有九個 LONG 值,並將 cPropCountPerPkt 設定為 9。
cPropCountPerPkt 值有助於釐清針對 NewPackets 事件事件等事件所出現之整數一般數位中的封包之間的界限。 封包可以搭配使用數據傳輸更有效率,因此不需要每個封包呼叫外掛程式一次。
範例
下列 C++ 程式代碼範例會實作 StylusUp 方法,以呼叫 Helper 函式 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 |