Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 2019
-
4 févr. 2009 à 16:01
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
5 févr. 2009 à 14:55
Bonjour,
Alors voila je cherche en ce moment à récupérer la position de la souris AU MOMENT du dernier appuis sur le bouton gauche de la souris (si possible, j'explique pourquoi plus bas mais si vous avez une autre solution je suis preneur)
Déjà ce qui me fait dire que c'est possible :
http://www.developpez.net/forums/d210919/dotnet/csharp/csharp-2-detecter-click-souris-maniere-globale/ Sur ce topic bossun (je l'es contacté) à l'aire sur de lui quand il dit :
"la moindre petite action que tu génère crée des messages dans ton OS que tu peux récupérer par après"
Donc je me dit que sa pourrais me permettre de corrigé un petit problème que je rencontre actuellement
J'imagine qu'une API existe....
Le problème que je veut corrigé :
Je cherche à interdire le déplacement des graphique dans un MSChart (VB6) pour cela j'utilise l'API mouse_event pour forcé le relâchement du click au moment de la sélection d'une liste (ou d'un point). Ce qui fonctionne très bien. Donc je veut maintenant me crée une classe "ClassMSChartUnmovable" qui prendras en charge la gestion de tout les MSChart de mon appli (pck il y en à ÉNORMÉMENT en final ). Problème si l'événement sélect d'une liste déclaré sur la form met du temps à s'exécute (et une simple mise à jours du label d'un caption suffi) alors l'utilisateur pourras déplacé (très légèrement dans le cas de la maj du label, mais trop quand même) la liste (effet très visible en camembert).
Donc il fraudais que :
- soit l'événement de ma classe soit exécuté le 1er.
- soit que je connaisse la position de la souris au moment de l'appuis et acini la remettre en place avent le relâchement forcé.
- soit sauvegardé et repositioné les éléments du graph mais je n'es pas trouvé de propriété accésible dans les MSChart pour faire sa non plus
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 5 févr. 2009 à 12:14
Tout vas bien les X et Y semble correct
(J'utilise SetCursorPos qui reçoit des pixel plutôt que mouse_event qui attend des valeur de 0 à 65535)
Ma fonction de placement du pointeur :
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Sub MousePlaceSourisForm(ByVal ScaleX As Long, ByVal ScaleY As Long, ByRef FormParent As Form, Optional ModePositionXY As ScaleModeConstants = vbTwips)
Dim Xpos As Long
Dim Ypos As Long
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 5 févr. 2009 à 14:50
Bon bà voila la fonction :
ATTENTION les X et Y doivent être issu de la form (et non d'un contrôle) pour que le placement soit correct ;)
Public Sub MousePlaceSourisForm(ByVal ScaleX As Long, ByVal ScaleY As Long, ByRef FormParent As Form, Optional ModePositionXY As ScaleModeConstants = vbTwips)
Dim PositionSouris As POINTAPI
PositionSouris.x = FormParent.ScaleX(ScaleX, ModePositionXY, vbPixels)
PositionSouris.y = FormParent.ScaleY(ScaleY, ModePositionXY, vbPixels)
ClientToScreen FormParent.hwnd, PositionSouris
SetCursorPos PositionSouris.x, PositionSouris.y
End Sub
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202172 4 févr. 2009 à 16:26
simple SubClassing
lorsque le curseur de ta souris arrive sur un chart, espionne les messages de la souris.
si tu vois un click, supprime le de la file,
si tu vois un autre message, transmets le a la fonction de gestion d'origine
tu peux peut etre même jouer simplement, avec l'evenement indiquant la prise du focus...
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 5 févr. 2009 à 09:48
Oui en effet je dois pouvoir faire sa avec le SubClassing (tu veut dire en créant un user control contenant un MSChart. Faudrait que je re-potasse le sub classing, un tuto existe sur ce forum donc pas de soucis)
En ce moment je m'intéresse à l'évènement "mouse_down" du MSChart qui me donne la positon X,Y de la souris au moment du click je vérif si la position est bien exacte. Si ce n'est pas le cas je pense que le SubClassing fera l'affaire
Polack77
Messages postés1098Date d'inscriptionmercredi 22 mars 2006StatutMembreDernière intervention22 octobre 20191 5 févr. 2009 à 12:45
Je ne m'en suis pas servie car je ne connaissais pas leur existence Forcément dur de l'utilisé .
Par contre je ne comprend pas bien son fonctionnement ????
Ci dessous ne fonctionne pas (enfin la souris n'est pas à l'emplacement voulut) :
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Public Sub MousePlaceSourisForm(ByVal ScaleX As Long, ByVal ScaleY As Long, ByRef FormParent As Form) ', Optional ModePositionXY As ScaleModeConstants = vbTwips
Dim test As POINTAPI
test.x = ScaleX
test.y = ScaleY
ClientToScreen FormParent.hwnd, test
mouse_event C_MouseEventF_Move Or C_MouseEventF_Absolute, test.x, test.y, 0, 0
'mouse_event C_MouseEventF_Move, test.x, test.y, 0, 0 '<- Sa c'est pire :/
End Sub