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 |