Condividi tramite


Metodo IStylusPlugin::StylusDown (rtscom.h)

Notifica al plug-in di implementazione che la penna del tablet ha toccato la superficie del digitalizzatore.

Sintassi

HRESULT StylusDown(
  [in]      IRealTimeStylus  *piRtsSrc,
  [in]      const StylusInfo *pStylusInfo,
  [in]      ULONG            cPropCountPerPkt,
  [in]      LONG             *pPacket,
  [in, out] LONG             **ppInOutPkt
);

Parametri

[in] piRtsSrc

Oggetto RealTimeStylus Class (RTS) che ha inviato la notifica.

[in] pStylusInfo

Struttura StylusInfo contenente le informazioni sull'RTS associato allo stilo.

[in] cPropCountPerPkt

Numero di proprietà per pacchetto. I valori validi sono compresi tra 0 e 32 inclusi.

[in] pPacket

Inizio dei dati del pacchetto.

[in, out] ppInOutPkt

Puntatore al pacchetto di dati dello stilo modificato. Il plug-in può usare questo parametro per inserire i dati dei pacchetti modificati in pacchetti downstream. Un valore diverso da NULL indica che il pacchetto è stato modificato e RTS invierà questi dati ai plug-in usando il parametro pPacket .

Valore restituito

Per una descrizione dei valori restituiti, classi e interfacce RealTimeStylus.

Commenti

È possibile restituire una matrice di pacchetti modificati nel buffer, ppInOutPkt. I pacchetti usati dal metodo IStylusPlugin::StylusUp e i metodi del metodo IStylusPlugin::StylusDown possono essere modificati solo. È possibile eliminare i pacchetti usati dal metodo IStylusPlugin::P ackets e IStylusPlugin::InAirPackets .

Se si modificano i pacchetti, cPropCountPerPkt, ovvero il numero di LONG in ppInOutPkt, deve essere divisibile in base alle proprietà dei pacchetti desiderate correnti (DPP) disponibili nel dispositivo di input corrente.

È possibile modificare i pacchetti aggiornando i parametri cPropCountPerPkt e ppInOutPkts . Modificare cPropCountPerPkt in un conteggio delle proprietà dei pacchetti totali valido e modificare ppInOutPkts in modo che punti a un buffer di dati valido, che tiene conto dei valori per ogni DPP in ogni pacchetto. In tale posizione può essere presente un solo pacchetto per il metodo IStylusPlugin::StylusUp e il metodo IStylusPlugin::StylusDown.

Ad esempio, se si aggiungono tre pacchetti e il DPP è attualmente X,Y e Pressure, è necessario avere nove valori LONG in questo buffer e impostare cPropCountPerPkt su 9.

Il valore cPropCountPerPkt è utile per chiarire i limiti tra i pacchetti nella matrice flat di interi inclusi per eventi come l'evento NewPackets Event . I pacchetti possono essere raggruppati per essere più efficienti con il trasferimento dei dati, in modo che non sia necessario che un plug-in venga chiamato una volta per pacchetto.

Esempio

L'esempio di codice C++ seguente implementa un metodo StylusDown che chiama una funzione helper , ModifyPacket, per modificare il valore dei dati X,Y per renderli compresi in un rettangolo specificato. Si tratta della stessa funzionalità implementata nell'esempio C# RealTimeStylus Plug-in Sample. Il secondo frammento di codice è la funzione ModifyPacket .

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;
}

Requisiti

   
Client minimo supportato Windows XP Tablet PC Edition [solo app desktop]
Server minimo supportato Nessuno supportato
Piattaforma di destinazione Windows
Intestazione rtscom.h
DLL RTSCom.dll

Vedi anche

IStylusAsyncPlugin

Interfaccia IStylusPlugin

IStylusSyncPlugin

Informazioni di riferimento su RealTimeStylus