Freigeben über


IStylusPlugin::P ackets-Methode (rtscom.h)

Benachrichtigt das Objekt, das das Plug-In implementiert, dass sich der Tablet-Stift auf dem Digitizer bewegt.

Syntax

HRESULT Packets(
  [in]      IRealTimeStylus  *piRtsSrc,
  [in]      const StylusInfo *pStylusInfo,
  [in]      ULONG            cPktCount,
  [in]      ULONG            cPktBuffLength,
  [in]      LONG             *pPackets,
  [in, out] ULONG            *pcInOutPkts,
  [in, out] LONG             **ppInOutPkts
);

Parameter

[in] piRtsSrc

Das RealTimeStylus-Klassenobjekt , das die Benachrichtigung gesendet hat.

[in] pStylusInfo

Eine StylusInfo-Strukturstruktur , die Informationen zum RTS enthält, das dem Stift zugeordnet ist.

[in] cPktCount

Die Anzahl der Eigenschaften pro Datenpaket.

[in] cPktBuffLength

Die Länge des Puffers in Bytes, auf den pPackets verweist. Der von jedem Paket belegte Arbeitsspeicher ist (cPktBuffLength / cPktCount). Gültige Werte sind einschließlich 0 bis 0x7FFF.

[in] pPackets

Ein Zeiger auf den Anfang der Paketdaten.

[in, out] pcInOutPkts

Die Anzahl der LONGs in ppInOutPkt.

[in, out] ppInOutPkts

Ein Zeiger auf ein Array geänderter Eingabestiftdatenpakete. Das Plug-In kann diesen Parameter verwenden, um geänderte Paketdaten an nachgeschaltete Pakete einzuspeisen. Ein anderer Wert als NULL gibt an, dass der 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

Tritt auf, wenn sich der Stift bewegt und die Digitizeroberfläche berührt. Verwenden Sie diese Benachrichtigung, um die Paketdaten innerhalb eines angegebenen Rechtecks einzuschränken. Pakete, die von den Methoden IStylusPlugin::P ackets Method und IStylusPlugin::InAirPackets Method verwendet werden, können gelöscht werden.

Sie können ein Array geänderter Pakete mit dem ppInOutPkt-Parameter zurückgeben.

Pakete können gebündelt werden, um die Datenübertragung effizienter zu gestalten, sodass ein Plug-In nicht einmal pro Paket aufgerufen werden muss. Die IStylusPlugin::InAirPackets-Methode und die IStylusPlugin::P ackets-Methode können ein oder mehrere Pakete senden.

Beispiele

Im folgenden C++-Codebeispiel wird eine IStylusPlugin::P ackets-Methode implementiert, die die X,Y-Daten ändert, um die Pakete in ein Rechteck zu schränken. Dies ist die gleiche Funktionalität, die in C# im Beispiel des RealTimeStylus-Plug-Ins implementiert wird.

STDMETHODIMP CPacketModifier::Packets( 
            /* [in] */ IRealTimeStylus *piRtsSrc,
            /* [in] */ const StylusInfo *pStylusInfo,
            /* [in] */ ULONG cPktCount,
            /* [in] */ ULONG cPktBuffLength,
            /* [size_is][in] */ LONG *pPackets,
            /* [out][in] */ ULONG *pcInOutPkts,
            /* [out][in] */ LONG **ppInOutPkts)
{
	BOOL fModified = FALSE;                             // Did we change the packet data?
	ULONG cPropertyCount = cPktBuffLength/cPktCount;    // # of properties in a packet
	ULONG iOtherProps = 0;                              // Properties other than X and Y

	// Allocate memory for modified packets
	LONG* pTempOutPkts = (LONG*)CoTaskMemAlloc(sizeof(ULONG)*cPktBuffLength);

	// For each packet 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.
	for (ULONG i = 0; i < cPktCount; i += cPropertyCount)
	{
		// Packet data always has X followed by Y 
		// followed by the rest
		LONG x = pPackets[i];
		LONG y = pPackets[i+1];

		// Constrain points to the input 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 != pPackets[i]) || (y != pPackets[i+1]))
		{
			pTempOutPkts[i] = x;
			pTempOutPkts[i+1] = y;
			iOtherProps = i+2;
		
			// Copy the properties that we haven't modified
			while (iOtherProps < (i + cPropertyCount))
			{
				pTempOutPkts[iOtherProps] = pPackets[iOtherProps++];
			}

			fModified = TRUE;
		}
	}

	if (fModified)
	{
		// Set the [out] pointer to the 
		// memory we allocated and updated
		*ppInOutPkts = pTempOutPkts;
		*pcInOutPkts = cPktCount;
	}
	else
	{
		// Nothing modified, release the memory we allocated
		CoTaskMemFree(pTempOutPkts);
	}

	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

IStylusPlugin::StylusDown-Methode

IStylusPlugin::StylusUp-Methode

Istylussyncplugin

RealTimeStylus-Klasse