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

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
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.
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
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.
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
■ La question aussi sotte que grenu
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
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

Re: Tester si bouton de souris appuyé ?
Publié : lun. 27/mars/2023 22:34
par Stan_fr
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
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...
.