Freigeben über


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

Weitere Informationen

Istylusasyncplugin

IStylusPlugin-Schnittstelle

Istylussyncplugin

RealTimeStylus-Klasse