Condividi tramite


Metodo IStylusPlugin::StylusUp (rtscom.h)

Notifica al plug-in di implementazione che l'utente ha generato la penna del tablet dalla superficie del digitalizzatore di tablet.

Sintassi

HRESULT StylusUp(
  [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 alla penna.

[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, vedere Classi e interfacce RealTimeStylus.

Commenti

Questo metodo viene usato quando la penna lascia la superficie del digitalizzatore.

È 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. Non possono essere eliminati. È 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.

Per modificare i pacchetti, aggiornare i parametri cPropCountPerPkt e ppInOutPkts . Modificare cPropCountPerPkt impostando un conteggio delle proprietà dei pacchetti totali valido e ppInOutPkts in 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 StylusUp 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::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;
}

Requisiti

Requisito Valore
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

Classe RealTimeStylus