[Resolu]Problême : click gauche de souris

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

[Resolu]Problême : click gauche de souris

Message 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é... :oops: )

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 :wink:
Dernière modification par Ulix le mer. 20/juin/2007 4:03, modifié 1 fois.
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Message 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
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Message 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 :lol:
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Ulix

Ce serait bien que tu rajoutes [Résolu] à la fin du titre de ces posts !
Denis

Bonne Jounée à tous
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ? :lol:

il suffit de faire ça !! :D

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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Message par Ulix »

Merci pour toutes vos explications :lol:
Dernière modification par Ulix le mer. 20/juin/2007 4:18, modifié 2 fois.
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Message par Ulix »

Merci pour toutes vos explications (Bis) :lol:

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 !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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

Répondre