Tester si bouton de souris appuyé ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Tester si bouton de souris appuyé ?

Message 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.
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Tester si bouton de souris appuyé ?

Message par Fig »

Quelqu'un comprend il la question ? :?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Tester si bouton de souris appuyé ?

Message par SPH »

Non... Un code serait plus parlant :idea:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Tester si bouton de souris appuyé ?

Message 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
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Tester si bouton de souris appuyé ?

Message 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
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Tester si bouton de souris appuyé ?

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Tester si bouton de souris appuyé ?

Message 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 ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Tester si bouton de souris appuyé ?

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Tester si bouton de souris appuyé ?

Message 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

.
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Tester si bouton de souris appuyé ?

Message 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 :!:
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Tester si bouton de souris appuyé ?

Message par Marc56 »

Possibilités: utiliser les fonctions de Drag and drop ou des sprites
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Tester si bouton de souris appuyé ?

Message 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...
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Tester si bouton de souris appuyé ?

Message par falsam »

Mise en oeuvre des API Windows avec PureBasic.

https://www.rsbasic.de/winapi-library/
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Tester si bouton de souris appuyé ?

Message 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:
Stan_fr
Messages : 84
Inscription : mar. 07/mars/2023 20:01
Localisation : NANTES

Re: Tester si bouton de souris appuyé ?

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