IStylusPlugin::StylusUp-Methode (rtscom.h)
Benachrichtigt das implementierende Plug-In, dass der Benutzer den Tablet-Stift von der Tablet-Digitizer-Oberfläche angehoben hat.
Syntax
HRESULT StylusUp(
[in] IRealTimeStylus *piRtsSrc,
[in] const StylusInfo *pStylusInfo,
[in] ULONG cPropCountPerPkt,
[in] LONG *pPacket,
[in, out] LONG **ppInOutPkt
);
Parameter
[in] piRtsSrc
Das RTS-Objekt ( RealTimeStylus Class ), das die Benachrichtigung gesendet hat.
[in] pStylusInfo
Eine StylusInfo-Struktur mit den Informationen zum RTS, der dem Stift zugeordnet ist.
[in] cPropCountPerPkt
Anzahl der Eigenschaften pro Paket. Gültige Werte sind 0 bis einschließlich 32.
[in] pPacket
Der Anfang der Paketdaten.
[in, out] ppInOutPkt
Ein Zeiger auf das geänderte Datenpaket des Eingabestifts. Das Plug-In kann diesen Parameter verwenden, um geänderte Paketdaten an Downstreampakete zu senden. Ein anderer Wert als NULL gibt an, dass das Paket geändert wurde und RTS diese Daten mithilfe des pPacket-Parameters an Plug-Ins sendet.
Rückgabewert
Eine Beschreibung der Rückgabewerte finden Sie unter RealTimeStylus-Klassen und -Schnittstellen.
Hinweise
Diese Methode wird verwendet, wenn der Stift die Digitizeroberfläche verlässt.
Sie können ein Array geänderter Pakete im Puffer zurückgeben, ppInOutPkt. Pakete, die von den Methoden IStylusPlugin::StylusUp und IStylusPlugin::StylusDown Method verwendet werden, können nur geändert werden. Sie können nicht gelöscht werden. Pakete, die von den Methoden IStylusPlugin::P ackets und IStylusPlugin::InAirPackets Method verwendet werden, können gelöscht werden.
Wenn Sie Pakete ändern, muss cPropCountPerPkt, d. h. die Anzahl der LONGs in ppInOutPkt, durch die aktuellen gewünschten Paketeigenschaften (DPP) teilbar sein, die auf dem aktuellen Eingabegerät verfügbar sind.
Sie ändern Pakete, indem Sie die Parameter cPropCountPerPkt und ppInOutPkts aktualisieren. Ändern Sie cPropCountPerPkt in eine gültige Gesamtzahl der Paketeigenschaften und ppInOutPkts in einen gültigen Datenpuffer, der Werte für jeden DPP in jedem Paket berücksichtigt. An diesem Speicherort kann nur ein Paket für die IStylusPlugin::StylusUp-Methode und die IStylusPlugin::StylusDown-Methode vorhanden sein.
Wenn Sie beispielsweise drei Pakete hinzufügen und Ihr DPP derzeit X, Y und Pressure ist, müssen Sie neun LONG-Werte in diesem Puffer enthalten und cPropCountPerPkt auf 9 festlegen.
Der cPropCountPerPkt-Wert ist nützlich, um die Grenzen zwischen Paketen im flachen Array von ganzen Zahlen zu verdeutlichen, das für Ereignisse wie das NewPackets-Ereignis eingeht. Pakete können gebündelt werden, um bei der Datenübertragung effizienter zu sein, sodass es nicht erforderlich ist, dass ein Plug-in einmal pro Paket aufgerufen wird.
Beispiele
Im folgenden C++-Codebeispiel wird eine StylusUp-Methode implementiert, die die Hilfsfunktion ModifyPacket aufruft, um den Wert der X,Y-Daten so zu ändern, dass sie in ein angegebenes Rechteck fallen. Dies ist die gleiche Funktionalität, die im C#-Beispiel realTimeStylus Plug-In Sample implementiert ist. Der zweite Codeausschnitt ist die ModifyPacket-Funktion .
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;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows XP Tablet PC Edition [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Nicht unterstützt |
Zielplattform | Windows |
Kopfzeile | rtscom.h |
DLL | RTSCom.dll |