Page 1 sur 4

Tester si bouton de souris appuyé ?

Publié : dim. 26/mars/2023 16:41
par Stan_fr
Bonjour,

Les gadgets répondent à des clicks de bouton de la souris, mais pas à des entrées de la souris avec le bouton de la souris déjà baissé.

Y-aurait-t-il un moyen de contourner cela ?

Merci d'avance.

Re: Tester si bouton de souris appuyé ?

Publié : dim. 26/mars/2023 18:53
par Fig
Quelqu'un comprend il la question ? :?

Re: Tester si bouton de souris appuyé ?

Publié : dim. 26/mars/2023 21:59
par SPH
Non... Un code serait plus parlant :idea:

Re: Tester si bouton de souris appuyé ?

Publié : dim. 26/mars/2023 22:38
par boddhi

Code : Tout sélectionner

Procedure Thread(Argument)
  Define.RECT Zone
  Define.POINT Coord
  
  Repeat
    If GetAsyncKeyState_(#VK_LBUTTON)
      GetWindowRect_(GadgetID(1),Zone.RECT)
      GetCursorPos_(Coord.POINT)
      If PtInRect_(Zone,Coord\y<<32 + Coord\x)=#True
        SetGadgetText(2,"Survol Bouton droit appuyé")
      Else
        SetGadgetText(2,"")
      EndIf
    EndIf
    Delay(100)
  ForEver
EndProcedure

If OpenWindow(0,0,0,200,80,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ButtonGadget(1,10,10,180,24,"Bouton",0)
  TextGadget(2,10,40,180,24,"",0)
  
  CreateThread(@Thread(),0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: Tester si bouton de souris appuyé ?

Publié : dim. 26/mars/2023 23:07
par boddhi
Une autre solution :

Code : Tout sélectionner

Global CallbackBouton

Procedure Fc_CallbackBouton(ArgHWnd,ArgMessage,ArgWParam,ArgLParam)
  Select ArgMessage
    Case #WM_MOUSEMOVE
      If GetAsyncKeyState_(#VK_LBUTTON)=32769
        Debug "Ok"
      EndIf
  EndSelect
  
  ProcedureReturn CallWindowProc_(CallbackBouton,ArgHWnd,ArgMessage,ArgWParam,ArgLParam)
EndProcedure

If OpenWindow(0,0,0,200,80,"Test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ButtonGadget(1,10,10,180,24,"Bouton",0)
 
  CallbackBouton=SetWindowLongPtr_(GadgetID(1),#GWL_WNDPROC,@Fc_CallbackBouton())
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf

Re: Tester si bouton de souris appuyé ?

Publié : lun. 27/mars/2023 14:02
par Stan_fr
Fig a écrit : dim. 26/mars/2023 18:53 Quelqu'un comprend il la question ? :?
J'essaie d'être plus clair :

J'ai un gadget par exemple un bouton ButtonImageGadget, si je clique dessus avec la souris il fonctionne bien, par contre si "j'entre" (je le survole ?) dessus avec le bouton déjà baissé il ne réagit pas, idem si je clique sur le gadget et que j'en "sors" en maintenant le bouton baissé le click n'est pas pris en compte !

SPH a écrit :
Non... Un code serait plus parlant :idea:
Par exemple avec ce code (basé sur l'exemple de l'aide de pb pour ButtonImageGadget):

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 120, "ButtonImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
    If LoadImage(0,  #PB_Compiler_Home + "/Examples/Sources/Data/PureBasic.bmp")    ; image de l'exemple de l'aide de Pb
      ButtonImageGadget(0, 10, 10, 180, 40, ImageID(0))
    EndIf
    
    Repeat :
      Event = WaitWindowEvent() ; exemple-test : on affiche un message et c'est tout.    
    Select Event
      Case #PB_Event_Gadget
        MessageRequester( "Exemple", "bouton")
    EndSelect
   Until WaitWindowEvent() = #PB_Event_CloseWindow 
  EndIf
  

Si on clique et relâche le bouton sans quitter l'image ça affiche un MessageRequester, mais si on clique en dessous de l'image et qu'on remonte la souris bouton appuyé rien ne se produit, idem si on clique sur l'image et qu'on sort de celle-ci en maintenant le bouton appuyé.


@ boddhi
Désolé mais ça ne marche pas, chez moi ?

La première donne à la compilation une erreur :

[13:08:47] [COMPILER] Line 2: Structure not found: RECT.

La deuxième donne :

[13:06:31] [COMPILER] Line 5: Constant not found: #WM_MOUSEMOVE.

Re: Tester si bouton de souris appuyé ?

Publié : lun. 27/mars/2023 14:46
par falsam
Stan_fr a écrit : lun. 27/mars/2023 14:02 @ boddhi
Désolé mais ça ne marche pas, chez moi ?

La première donne à la compilation une erreur :

[13:08:47] [COMPILER] Line 2: Structure not found: RECT.

La deuxième donne :

[13:06:31] [COMPILER] Line 5: Constant not found: #WM_MOUSEMOVE.
C'est que tu utilises la version démo de PureBasic. RECT., #WM_MOUSEMOVE et des tas d'autres choses, sont des API propre aux systeme d'exploitation de Windows. La version de démonstration de PureBasic ne gère pas les API. Il faut contracter une licence. Cette licence est à vie, mise à jour comprise. De plus ça aide le développeur qui propulse ce langage.

:idea: 79 Euros pour une licence à vie ça se trouve ici https://www.purebasic.com/french/pricing.php
A consommer sans modération.

■ La question aussi sotte que grenu :mrgreen:
Stan_fr a écrit : lun. 27/mars/2023 14:02 par contre si "j'entre" (je le survole ?) dessus avec le bouton déjà baissé il ne réagit pas, idem si je clique sur le gadget et que j'en "sors" en maintenant le bouton baissé le click n'est pas pris en compte !
Non mais quel idée de vouloir quitter un gadget en maintenant le clique gauche de la souris ? Quel est l'objectif ?

Re: Tester si bouton de souris appuyé ?

Publié : lun. 27/mars/2023 14:56
par Ar-S
Comme tu l'as dit : un "clic"
Un clic comprend l'action d'appuyer et relâcher un bouton. Si ces 2 actions ne sont pas faites sur le même gadget forcément ça foire.
Essaye avec n'importe quel bouton du forum, n'importe quel soft, ça fera pareil.
Comme l'a dit Falsam, après tu as toujours des possibilités en utilisant les api et les 'états' des boutons (enfoncé (#WM_LBUTTONDOWN), souris qui bouge, bouton relâché etc) mais la version complète de PB est requise.

Re: Tester si bouton de souris appuyé ?

Publié : lun. 27/mars/2023 16:24
par Stan_fr
falsam a écrit : lun. 27/mars/2023 14:46
Stan_fr a écrit : lun. 27/mars/2023 14:02 @ boddhi
Désolé mais ça ne marche pas, chez moi ?

La première donne à la compilation une erreur :

[13:08:47] [COMPILER] Line 2: Structure not found: RECT.

La deuxième donne :

[13:06:31] [COMPILER] Line 5: Constant not found: #WM_MOUSEMOVE.
C'est que tu utilises la version démo de PureBasic. RECT., #WM_MOUSEMOVE et des tas d'autres choses, sont des API propre aux systeme d'exploitation de Windows. La version de démonstration de PureBasic ne gère pas les API. Il faut contracter une licence. Cette licence est à vie, mise à jour comprise. De plus ça aide le développeur qui propulse ce langage.

:idea: 79 Euros pour une licence à vie ça se trouve ici https://www.purebasic.com/french/pricing.php
A consommer sans modération.

FAIT ET EFFECTIVEMENT ÇA MARCHE :D

■ La question aussi sotte que grenu :mrgreen:
Stan_fr a écrit : lun. 27/mars/2023 14:02 par contre si "j'entre" (je le survole ?) dessus avec le bouton déjà baissé il ne réagit pas, idem si je clique sur le gadget et que j'en "sors" en maintenant le bouton baissé le click n'est pas pris en compte !
Non mais quel idée de vouloir quitter un gadget en maintenant le clique gauche de la souris ? Quel est l'objectif ?
L'objectif est de faire un programme qui remplisse les mêmes fonctions* que celui-ci qui nécessite une connexion pour fonctionner :

https://www.maxlaumeister.com/tonematrix/

où tu pourras constater que si tu déplaces la souris bouton gauche enfoncé ça sélectionne quand même ! (et même en venant de "l'extérieur" de la grille...)



*en fait les mêmes fonctions et peut-être plus (choix du son, des notes, sélection de la langue...), j'en ai peut-être pour un an avec de la chance :oops:

Pour l'instant j'en suis là :

https://drive.google.com/file/d/1vaFlML ... share_link

.

Re: Tester si bouton de souris appuyé ?

Publié : lun. 27/mars/2023 16:39
par boddhi
Les deux exemples fonctionneront si et seulement si :
1) Ton code tourne sous Windows
2)
falsam a écrit : C'est que tu utilises la version démo de PureBasic. RECT., #WM_MOUSEMOVE et des tas d'autres choses, sont des API propre aux systeme d'exploitation de Windows. La version de démonstration de PureBasic ne gère pas les API. Il faut contracter une licence. Cette licence est à vie, mise à jour comprise. De plus ça aide le développeur qui propulse ce langage.
Ce que tu souhaites ne sera pas faisable 1) avec la version démo et 2) avec les commandes natives de PB :!:

Re: Tester si bouton de souris appuyé ?

Publié : lun. 27/mars/2023 16:51
par Marc56
Possibilités: utiliser les fonctions de Drag and drop ou des sprites

Re: Tester si bouton de souris appuyé ?

Publié : lun. 27/mars/2023 17:30
par Stan_fr
boddhi a écrit : lun. 27/mars/2023 16:39 Les deux exemples fonctionneront si et seulement si :
1) Ton code tourne sous Windows
2)
falsam a écrit : C'est que tu utilises la version démo de PureBasic. RECT., #WM_MOUSEMOVE et des tas d'autres choses, sont des API propre aux systeme d'exploitation de Windows. La version de démonstration de PureBasic ne gère pas les API. Il faut contracter une licence. Cette licence est à vie, mise à jour comprise. De plus ça aide le développeur qui propulse ce langage.
Ce que tu souhaites ne sera pas faisable 1) avec la version démo et 2) avec les commandes natives de PB :!:
Oui, j'ai compris : j'ai maintenant une version avec licence et tes exemples fonctionnent !
MERCI !

Reste plus qu'à trouver une doc sur les API...

Re: Tester si bouton de souris appuyé ?

Publié : lun. 27/mars/2023 18:27
par falsam
Mise en oeuvre des API Windows avec PureBasic.

https://www.rsbasic.de/winapi-library/

Re: Tester si bouton de souris appuyé ?

Publié : lun. 27/mars/2023 18:47
par boddhi
Je te conseille vivement de te familiariser avec PB avant de te lancer dans les API ! C'est un aspect très ardu !
Commencer par de petits projets avant d'attaquer quelque chose de plus conséquent.

Un maçon commence toujours par construire de petits pans de murs avant de s'attaquer à la construction d'une maison :wink:

Re: Tester si bouton de souris appuyé ?

Publié : lun. 27/mars/2023 22:34
par Stan_fr
falsam a écrit : lun. 27/mars/2023 18:27 Mise en oeuvre des API Windows avec PureBasic.

https://www.rsbasic.de/winapi-library/
OK MERCI !

boddhi a écrit : Un maçon commence toujours par construire de petits pans de murs avant de s'attaquer à la construction d'une maison :wink:
Oui, mais un maçon a le droit d'utiliser un perforateur avec des avec des outils sds, si ça lui permet de mieux bosser... :)
.