Page 1 sur 1
[Resolu]Problême : click gauche de souris
Publié : lun. 18/juin/2007 16:21
par Ulix
Boujour a tous !
Un autre prôbleme a livré a votre sagacité : détecté le click gauche de la souris.
Testé le code suivant pour tous comprendre (et évétuellement y pourté une solution, moi j'échoué...

)
En deux mots, comment intercepté le click gauche de la souris et déterminé l'état (appuyer ou relacher) avant le gadget ?
Code : Tout sélectionner
Enumeration
#f1:#GadgetImage
EndEnumeration
If OpenWindow(#f1,10,10,300,300,"Test sur Souris",#PB_Window_SystemMenu)
If CreateGadgetList(WindowID(#f1))
;Commenté ou décommenté la ligne suivant pour bien voir la différence de traitement
;souris potionné sur le gadget
;ligne Commenté : le click gauche appuyé est détecté
;ligne décommenté : le click gauche a disparu (intersecté par la gadget, normal ???)
;Normal, je n'en suis pas sûr !! Car la même action faite avec le bouton droit de la souris
;n'est pas capturé et pourtant il existe bien un evenement : #PB_EventType_RightClick
;Pourquoi cette différence de traitement ??
;Y-t-il un BUG ??
ImageGadget(#GadgetImage, 50, 50, 200, 200, 0, #PB_Image_Border)
;est-il possible intécepté le click gauche avant le gadget, si oui avec quel commande ?
;J'ai essayé avec la fonction API GetKeyState_(#VK_LBUTTON), sans arrivé a un résultat satisfaisant !
;Y a-til une autre commande (Voir une API) utilisable ?
;Avec quel méthode peut-on bien faire la distinction entre bouton appuyer et bouton ralacher
EndIf
Repeat
Select WaitWindowEvent()
Case #WM_RBUTTONDOWN : Debug "Souris Bouton droit appuyer"
Case #WM_RBUTTONUP : Debug "Souris Bouton droit relacher"
Case #WM_LBUTTONDOWN : Debug "Souris Bouton gauche appuyer"
Case #WM_LBUTTONUP : Debug "Souris Bouton gauche relacher"
Case #WM_MOUSEMOVE : ;Debug "Souris en mouvement"
Case #PB_Event_Gadget
Select EventGadget()
Case #GadgetImage : ;Ici les EventType() ne permettent pas la distinction entre
; le bouton appuyer et le bouton relacher ??
;Comment faire cette différence ?
If EventType()=#PB_EventType_LeftClick : EndIf
If EventType()=#PB_EventType_RightClick : EndIf
EndSelect
Case #PB_Event_CloseWindow: End
EndSelect
ForEver
EndIf
Merci de vos sujestion et de vos exemples

Publié : lun. 18/juin/2007 18:08
par Cls
Effectivement je viens de tester ton code, il y a un problème. Le click droit ne présente pas de soucis, par contre lorsque l'on clique gauche sur un gadget, l'évènement "Souris Bouton gauche appuyer" disparait... Cela ne se produit pas lorsque la souris n'est pas positionnée sur un gadget.
Voilà une solution pour "régler" le problème, créer un nouvel évènement (13100) :
Code : Tout sélectionner
Enumeration
#f1:#GadgetImage
EndEnumeration
#WM_LBUTTONDOWN_X = 13100
If OpenWindow(#f1,10,10,300,300,"Test sur Souris",#PB_Window_SystemMenu)
If CreateGadgetList(WindowID(#f1))
ImageGadget(#GadgetImage, 50, 50, 200, 200, 0, #PB_Image_Border)
EndIf
Repeat
wwe = WaitWindowEvent()
If wwe <> 512 And wwe <> 160 ; deplacement de la souris & deplacement sur system
Debug wwe
EndIf
Select wwe
Case #WM_RBUTTONDOWN : Debug "Souris Bouton droit appuyer"
Case #WM_RBUTTONUP : Debug "Souris Bouton droit relacher"
Case #WM_LBUTTONDOWN, #WM_LBUTTONDOWN_X : Debug "Souris Bouton gauche appuyer"
Case #WM_LBUTTONUP : Debug "Souris Bouton gauche relacher"
Case #PB_Event_CloseWindow : End
EndSelect
ForEver
EndIf
Publié : lun. 18/juin/2007 18:39
par Ulix
Merci Cls, pour cette solution !
Je vais l'essayé.
Parcontre si le problême est bien un Bug je le posterai dans la section des Bug.
D'ici là n'hésitaient a tester le code et confirmer l'existance du Bug.
Merci d'avance

Publié : lun. 18/juin/2007 19:11
par brossden
Ulix
Ce serait bien que tu rajoutes [Résolu] à la fin du titre de ces posts !
Publié : lun. 18/juin/2007 19:25
par Cls
Je ne sais pas s'il s'agit vraiment d'un bug. L'explication :
Lorsque la souris pointe vers la fenetre les évènements renvoyés sont (entre autres évidement) :
513 - Bouton gauche appuyé
514 - Bouton gauche relâché
516 - Bouton droit appuyé
517 - Bouton droit relâché
Le problème c'est que lorsque la souris pointe vers un gadget, voilà ce qui est renvoyé :
13100 - Bouton gauche appuyé
514 - Bouton gauche relâché
516 - Bouton droit appuyé
517 - Bouton droit relâché
Cordialement,
Cls
Publié : lun. 18/juin/2007 19:32
par Backup
je pense que c'est normal
parceque le gadget doit etre prioritaire lorsque la souris le survol
du coup le clic gauche appuyé est capter par le gadget, et c'est pourquoi
au moment de l'affichage il a disparus, car il n'est plus a l'ordre du jour
pour la liste d'evenement , ayant ete traité pour le gadget, il n'existe plus dans la liste !!
quoi ? elle est foireuse mon explication ?
il suffit de faire ça !!
Code : Tout sélectionner
Enumeration
#f1:#GadgetImage
EndEnumeration
If OpenWindow(#f1,10,10,300,300,"Test sur Souris",#PB_Window_SystemMenu)
If CreateGadgetList(WindowID(#f1))
;Commenté ou décommenté la ligne suivant pour bien voir la différence de traitement
;souris potionné sur le gadget
;ligne Commenté : le click gauche appuyé est détecté
;ligne décommenté : le click gauche a disparu (intersecté par la gadget, normal ???)
;Normal, je n'en suis pas sûr !! Car la même action faite avec le bouton droit de la souris
;n'est pas capturé et pourtant il existe bien un evenement : #PB_EventType_RightClick
;Pourquoi cette différence de traitement ??
;Y-t-il un BUG ??
ImageGadget(#GadgetImage, 50, 50, 200, 200, 0, #PB_Image_Border)
;est-il possible intécepté le click gauche avant le gadget, si oui avec quel commande ?
;J'ai essayé avec la fonction API GetKeyState_(#VK_LBUTTON), sans arrivé a un résultat satisfaisant !
;Y a-til une autre commande (Voir une API) utilisable ?
;Avec quel méthode peut-on bien faire la distinction entre bouton appuyer et bouton ralacher
EndIf
Repeat
Select WindowEvent()
Case #WM_RBUTTONDOWN : Debug "Souris Bouton droit appuyer"
Case #WM_RBUTTONUP : Debug "Souris Bouton droit relacher"
Case #WM_LBUTTONDOWN : Debug "Souris Bouton gauche appuyer"
Case #WM_LBUTTONUP :Debug "Souris Bouton gauche relacher"
Case #WM_MOUSEMOVE : ;Debug "Souris en mouvement"
Case #PB_Event_Gadget
Select EventGadget()
Case #GadgetImage : ;Ici les EventType() ne permettent pas la distinction entre
; le bouton appuyer et le bouton relacher ??
;Comment faire cette différence ?
If EventType()=#PB_EventType_LeftClick : Debug "Souris Bouton gauche appuyer" : EndIf
If EventType()=#PB_EventType_RightClick : EndIf
EndSelect
Case #PB_Event_CloseWindow: End
EndSelect
ForEver
EndIf
Publié : lun. 18/juin/2007 23:42
par nico
C'est tout à fait normal!
Un gadget image est une fenêtre, certains messages sont traités par cette fenêtres et d'autres pas, celles qui ne le sont pas sont renvoyés à la fenêtre parente qui à son tour traite et renvoie les messages non traités à la fenêtre parente; ainsi de suite jusqu'à la dernière fenêtre qui est la fenêtre mère (principale).
Donc Fred a magouiller le gadget pour qu'il traite certains messages.
Publié : mer. 20/juin/2007 4:02
par Ulix
Merci pour toutes vos explications

Publié : mer. 20/juin/2007 4:13
par Ulix
Merci pour toutes vos explications (Bis)
J'en profit pour donné mon point de vue sur la gestion des evenement !
Je pense qu'en même, que les évenements souris (#WM_RBUTTONDOWN... etc) devraient pouvoir être intercepté par le programmeur avant les gadget afin de facilité l'écriture d'une autre procedure différente de celle du gadget.
Une sorte de CallBack !
Dans mon cas, il était important que je puisse interception l'appuie du bouton gauche audessus de la zone image, afin de mettre mon propre code.
Merci !
Publié : mer. 20/juin/2007 7:19
par Backup
Ulix a écrit :
Dans mon cas, il était important que je puisse interception l'appuie du bouton gauche audessus de la zone image, afin de mettre mon propre code.
Merci !
ben tu peux !!
essaye ça :
Enumeration
#f1 : #GadgetImage
EndEnumeration
If OpenWindow ( #f1 ,10,10,300,300, "Test sur Souris" , #PB_Window_SystemMenu )
If CreateGadgetList ( WindowID ( #f1 ))
;Commenté ou décommenté la ligne suivant pour bien voir la différence de traitement
;souris potionné sur le gadget
;ligne Commenté : le click gauche appuyé est détecté
;ligne décommenté : le click gauche a disparu (intersecté par la gadget, normal ???)
;Normal, je n'en suis pas sûr !! Car la même action faite avec le bouton droit de la souris
;n'est pas capturé et pourtant il existe bien un evenement : #PB_EventType_RightClick
;Pourquoi cette différence de traitement ??
;Y-t-il un BUG ??
ImageGadget ( #GadgetImage , 50, 50, 200, 200, 0, #PB_Image_Border )
;est-il possible intécepté le click gauche avant le gadget, si oui avec quel commande ?
;J'ai essayé avec la fonction API GetKeyState_(#VK_LBUTTON), sans arrivé a un résultat satisfaisant !
;Y a-til une autre commande (Voir une API) utilisable ?
;Avec quel méthode peut-on bien faire la distinction entre bouton appuyer et bouton ralacher
EndIf
Repeat
Select WindowEvent ()
Case #WM_RBUTTONDOWN : Debug "Souris Bouton droit appuyer"
Case #WM_RBUTTONUP : Debug "Souris Bouton droit relacher"
Case #WM_LBUTTONDOWN : Debug "Souris Bouton gauche appuyer"
Case #WM_LBUTTONUP : Debug "Souris Bouton gauche relacher"
Case #WM_MOUSEMOVE : ;Debug "Souris en mouvement"
Case #PB_Event_Gadget
Select EventGadget ()
Case #GadgetImage : ;Ici les EventType() ne permettent pas la distinction entre
; le bouton appuyer et le bouton relacher ??
;Comment faire cette différence ?
If EventType ()= #PB_EventType_LeftClick : Gosub perso : EndIf
If EventType ()= #PB_EventType_RightClick : EndIf
EndSelect
Case #PB_Event_CloseWindow : End
EndSelect
ForEver
EndIf
; routine qui s'execute seulement a l'appuis du bouton gauche sur le gadget !!
perso:
Beep_ (50,500)
MessageRequester ( "code perso en route" , "voila une petite routine perso sur l'appuis du bouton gauche" + Chr (10)+ "sur le gadget" , #PB_MessageRequester_Ok )
Return