IStylusPlugin ::StylusUp, méthode (rtscom.h)
Avertit le plug-in d’implémentation que l’utilisateur a levé le stylet de tablette à partir de la surface du numériseur de tablette.
Syntaxe
HRESULT StylusUp(
[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 paquet.
[in, out] ppInOutPkt
Pointeur vers le paquet de données du stylet modifié. Le plug-in peut utiliser ce paramètre pour alimenter les données de paquet modifiées dans les paquets en aval. Une valeur autre que NULL indique que le paquet a été modifié et RTS envoie 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.
Remarques
Cette méthode est utilisée lorsque le stylet quitte la surface du numériseur.
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 etIStylusPlugin ::StylusDown Method ne peuvent être modifiés que. Ils ne peuvent pas être supprimés. Les paquets utilisés par les méthodes IStylusPlugin ::P ackets etIStylusPlugin ::InAirPackets Peuvent être supprimés .
Si vous modifiez des paquets, cPropCountPerPkt, qui correspond au nombre de LONGs dans ppInOutPkt, doit être divisible par les propriétés de paquets souhaitées (DPP) actuelles disponibles sur l’appareil d’entrée actuel.
Vous modifiez les paquets en mettant à jour les paramètres cPropCountPerPkt et ppInOutPkts . Remplacez cPropCountPerPkt par un nombre total valide de propriétés de paquets et ppInOutPkts par une comptabilité de 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 fourni pour des événements tels que l’événement Événement NewPackets . 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 fois par paquet.
Exemples
L’exemple de code C++ suivant implémente une méthode StylusUp 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é qui est implémentée dans l’exemple C#, Exemple de plug-in RealTimeStylus. Le deuxième extrait de code est la fonction 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;
}
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows XP Édition Tablet 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 |