IStylusPlugin::StylusDown-Methode (rtscom.h)

Benachrichtigt das implementierende Plug-In, dass der Tablet-Stift die Digitizeroberfläche berührt hat.

Syntax

HRESULT StylusDown(
  [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 , die die Informationen zum RTS enthält, die dem Tablettstift 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: RealTimeStylus-Klassen und -Schnittstellen.

Hinweise

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. 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 können Pakete ändern, indem Sie die Parameter cPropCountPerPkt und ppInOutPkts aktualisieren. Ändern Sie cPropCountPerPkt in eine gültige Gesamtanzahl der Paketeigenschaften, und ändern Sie ppInOutPkts in zeiger auf 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 StylusDown-Methode implementiert, die die Hilfsfunktion ModifyPacket aufruft, um den Wert der X,Y-Daten so zu ändern, dass er in ein angegebenes Rechteck fällt. 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::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;
}

Anforderungen

   
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-Referenz