Método IStylusPlugin::StylusUp (rtscom.h)
Notifica al complemento de implementación que el usuario ha elevado el lápiz de tableta desde la superficie del digitalizador de tableta.
Sintaxis
HRESULT StylusUp(
[in] IRealTimeStylus *piRtsSrc,
[in] const StylusInfo *pStylusInfo,
[in] ULONG cPropCountPerPkt,
[in] LONG *pPacket,
[in, out] LONG **ppInOutPkt
);
Parámetros
[in] piRtsSrc
Objeto RealTimeStylus (Clase RTS) que envió la notificación.
[in] pStylusInfo
Estructura StylusInfo que contiene la información sobre el RTS asociado al lápiz.
[in] cPropCountPerPkt
Número de propiedades por paquete. Los valores válidos son de 0 a 32, ambos incluidos.
[in] pPacket
Inicio de los datos del paquete.
[in, out] ppInOutPkt
Puntero al paquete de datos de lápiz óptico modificado. El complemento puede usar este parámetro para alimentar los datos modificados del paquete a los paquetes de bajada. Un valor distinto de NULL indica que el paquete se ha modificado y RTS enviará estos datos a complementos mediante el parámetro pPacket .
Valor devuelto
Para obtener una descripción de los valores devueltos, vea RealTimeStylus Classes and Interfaces (Clases e interfaces de RealTimeStylus).
Comentarios
Este método se usa cuando el lápiz sale de la superficie del digitalizador.
Puede devolver una matriz de paquetes modificados en el búfer, ppInOutPkt. Los paquetes usados por los métodos IStylusPlugin::StylusUp yIStylusPlugin::StylusDown (Método) solo se pueden modificar. No se pueden eliminar. Los paquetes usados por los métodos IStylusPlugin::P ackets yIStylusPlugin::InAirPackets (Método) se pueden eliminar.
Si modifica paquetes, cPropCountPerPkt, que es el número de LONG en ppInOutPkt, debe ser divisible por las propiedades de paquete deseadas actuales (DPP) disponibles en el dispositivo de entrada actual.
Para modificar paquetes, actualice los parámetros cPropCountPerPkt y ppInOutPkts . Cambie cPropCountPerPkt a un recuento de propiedades de paquete total válido y ppInOutPkts a un búfer de datos válido que contabiliza los valores de cada DPP de cada paquete. Solo puede haber un paquete en esa ubicación para IStylusPlugin::StylusUp (Método) e IStylusPlugin::StylusDown (Método).
Por ejemplo, si agrega tres paquetes y su DPP es actualmente X, Y y Pressure, debe tener nueve valores LONG en este búfer y establecer cPropCountPerPkt en 9.
El valor cPropCountPerPkt es útil para ayudar a aclarar los límites entre los paquetes de la matriz plana de enteros que entran en para eventos como el evento NewPackets Event . Los paquetes se pueden agrupar para ser más eficientes con la transferencia de datos, de modo que no sea necesario que se llame a un plug-una vez por paquete.
Ejemplos
El siguiente ejemplo de código de C++ implementa un método StylusUp que llama a una función auxiliar, ModifyPacket, para cambiar el valor de los datos X,Y para que caiga dentro de un rectángulo especificado. Esta es la misma funcionalidad que se implementa en el ejemplo de C#, RealTimeStylus Plug-in Sample. El segundo fragmento de código es la función 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;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows XP Tablet PC Edition [solo aplicaciones de escritorio] |
Servidor mínimo compatible | No se admite ninguno |
Plataforma de destino | Windows |
Encabezado | rtscom.h |
Archivo DLL | RTSCom.dll |