Compartir a través de


Método IStylusPlugin::StylusDown (rtscom.h)

Notifica al complemento de implementación que el lápiz de tableta ha tocado la superficie del digitalizador.

Sintaxis

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

Parámetros

[in] piRtsSrc

Objeto De clase RealTimeStylus (RTS) que envió la notificación.

[in] pStylusInfo

Estructura StylusInfo que contiene la información sobre el RTS asociado al lápiz óptico.

[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 de paquetes modificados a los paquetes de bajada. Un valor distinto de NULL indica que el paquete se ha modificado y RTS enviará estos datos a los complementos mediante el parámetro pPacket .

Valor devuelto

Para obtener una descripción de los valores devueltos, Clases e interfaces RealTimeStylus.

Comentarios

Puede devolver una matriz de paquetes modificados en el búfer, ppInOutPkt. Los paquetes usados por el método IStylusPlugin::StylusUp y los métodos IStylusPlugin::StylusDown Método solo se pueden cambiar. 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 (DPP) actuales disponibles en el dispositivo de entrada actual.

Puede modificar paquetes actualizando los parámetros cPropCountPerPkt y ppInOutPkts . Cambie cPropCountPerPkt a un recuento de propiedades de paquete total válido y cambie ppInOutPkts a puntero a un búfer de datos válido que tiene en cuenta los valores de cada DPP de cada paquete. Solo se puede presentar 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 se incluyen en 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 complemento una vez por paquete.

Ejemplos

El siguiente ejemplo de código de C++ implementa un método StylusDown que llama a una función auxiliar, ModifyPacket, para cambiar el valor de los datos X,Y para que se encuentre 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::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;
}

Requisitos

   
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

Consulte también

IStylusAsyncPlugin

IStylusPlugin (Interfaz)

IStylusSyncPlugin

Referencia de RealTimeStylus