Partager via


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

Avertit le plug-in d’implémentation que le stylet de la tablette a touché la surface du numériseur.

Syntaxe

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

Paramètres

[in] piRtsSrc

Objet RTS (RealTimeStylus Class ) qui a envoyé la notification.

[in] pStylusInfo

Structure StylusInfo contenant les informations sur le RTS associé au stylet.

[in] cPropCountPerPkt

Nombre de propriétés par paquet. Les valeurs valides sont comprises entre 0 et 32, inclus.

[in] pPacket

Début des données de paquets.

[in, out] ppInOutPkt

Pointeur vers le paquet de données du stylet modifié. Le plug-in peut utiliser ce paramètre pour fournir des données de paquets modifiées à des paquets en aval. Une valeur autre que NULL indique que le paquet a été modifié et QUE RTS enverra ces données aux plug-ins à l’aide du paramètre pPacket .

Valeur retournée

Pour obtenir une description des valeurs de retour, consultez Classes et interfaces RealTimeStylus.

Notes

Vous pouvez retourner un tableau de paquets modifiés dans la mémoire tampon, ppInOutPkt. Les paquets utilisés par les méthodes IStylusPlugin::StylusUp, méthode et IStylusPlugin::StylusDown, peuvent uniquement être modifiés. Les paquets utilisés par les méthodes IStylusPlugin::P ackets, méthode et IStylusPlugin::InAirPackets, méthode peuvent être supprimés.

Si vous modifiez des paquets, cPropCountPerPkt, qui est le nombre de LONG dans ppInOutPkt, doit être divisible par les propriétés de paquets souhaitées (DPP) actuelles disponibles sur le périphérique d’entrée actuel.

Vous pouvez modifier des paquets en mettant à jour les paramètres cPropCountPerPkt et ppInOutPkts . Remplacez cPropCountPerPkt par un nombre total valide de propriétés de paquets et remplacez ppInOutPkts par un pointeur vers une mémoire tampon de données valide pour les valeurs de chaque DPP dans chaque paquet. Un seul paquet peut être présent à cet emplacement pour la méthode IStylusPlugin::StylusUp et la méthode IStylusPlugin::StylusDown.

Par exemple, si vous ajoutez trois paquets et que votre DPP est actuellement X, Y et Pressure, vous devez avoir neuf valeurs LONG dans cette mémoire tampon et définir cPropCountPerPkt sur 9.

La valeur cPropCountPerPkt est utile pour clarifier les limites entre les paquets dans le tableau plat d’entiers qui entre pour des événements tels que l’événement NewPackets Event . Les paquets peuvent être regroupés afin d’être plus efficaces avec le transfert de données, de sorte qu’il n’est pas nécessaire qu’un plug-in soit appelé une seule fois par paquet.

Exemples

L’exemple de code C++ suivant implémente une méthode StylusDown qui appelle une fonction d’assistance, ModifyPacket, pour modifier la valeur des données X,Y afin qu’elles se trouvent dans un rectangle spécifié. Il s’agit de la même fonctionnalité que celle implémentée dans l’exemple C#, Exemple de plug-in RealTimeStylus. Le deuxième extrait de code est la fonction 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;
}

Spécifications

   
Client minimal pris en charge Windows XP Édition Tablette PC [applications de bureau uniquement]
Serveur minimal pris en charge Aucun pris en charge
Plateforme cible Windows
En-tête rtscom.h
DLL RTSCom.dll

Voir aussi

Istylusasyncplugin

IStylusPlugin, interface

IStylusSyncPlugin

Référence RealTimeStylus