Page 1 sur 1
Evènements souris
Publié : jeu. 17/févr./2011 15:40
par lush
Bonjour,
Ça fait quelques jours que je fais mumuse avec PB, et j'ai une petite question.
J'ai créé un ImageGadget sur lequel je teste si l'utilisateur clique.
A ce que je vois, l'évènement "clic" (#PB_EventType_LeftClick) reçu par WaitWindowEvent() est en réalité un "mousedown" et non un "clic" (l'évènement se déclenche avant que je relâche le bouton de la souris).
J'ai bien vu ce sujet :
Mouse Event et j'ai bien peur que la réponse à ma question soit négative...
Ma question est donc la suivante : est-il possible, avec les fonctions PB, de gérer un clic et un dragstart sur le même ImageGadget ?
Merci

Re: Evènements souris
Publié : jeu. 17/févr./2011 15:57
par Backup
.............
Re: Evènements souris
Publié : jeu. 17/févr./2011 16:00
par falsam
Ce que tu souhaites c'est faire un drop d'une image à une autre ?
Re: Evènements souris
Publié : jeu. 17/févr./2011 16:42
par lush
Dobro a écrit :voir Tuto numero 9 section "Débutant"
Merci. Mais les appels à GetSystemMetrics_ et compagnie, ça ne doit pas trop marcher ailleurs que sous Windows, non ? J'aurais peut-être dû m'exprimer différemment mais par "les fonctions PB", j'entendais des instructions qui soient cross-platform (encore que Linux ne soit pas ma priorité)
falsam a écrit :Ce que tu souhaites c'est faire un drop d'une image à une autre ?
En fait non. Ça serait plutôt un genre de splashscreen (une fenêtre borderless avec un ImageGadget qui prend toute la surface).
Le but serait de pouvoir la déplacer quand elle me gêne (Drag) et la fermer/réduire (clic) quand je n'en veux plus.
C'est un projet que j'avais commencé il y a quelques années sous RealBasic, et j'essaie d'en porter certaines parties pour découvrir PureBasic. Ça change un peu de l'event driven, mais je commence à m'habituer à la boucle WaitWindowEvent()

(Je fais la même chose avec Lazarus, mais là c'est mes années Pascal qui sont bien loin...)
La finalité de la démarche, c'est de trouver un outil de dev qui me permette de faire quelque chose qui fonctionne sous Win et sous OS X sans avoir à coder trop de parties spécifiques à chaque OS.
Re: Evènements souris
Publié : ven. 18/févr./2011 21:19
par Le Soldat Inconnu
en multiplateforme, aucune idée.
Je ne sais le faire qu'avec des fonctions windows.
Re: Evènements souris
Publié : ven. 18/févr./2011 23:43
par lush
Merci pour ta réponse en tout cas
Ça répond à mes interrogations, à savoir qu'il n'y a pas de moyen d'y parvenir directement via les évènements de type #PB_Event_Gadget.
J'ai quand même réussi à faire ce que je voulais. A coups de Debug WaitWindowEvent() j'ai pu trouver que le bouton relâché déclenche un évènement de valeur 514, et je le gère en dehors de la partie qui gère les #PB_Event_Gadget.
C'est quand même un peu dommage que le clic soit assimilé à l'évènement "bouton enfoncé" et non pas à "bouton enfoncé - bouton relâché". C'est assez déroutant du point de vue utilisateur de voir une action se déclencher alors qu'on n'a pas relâché le bouton, je trouve.
Ceci dit, entre le tuto indiqué par Dobro et des bouts de fonction Mac trouvés sur le forum anglais, je pense qu'il y a moyen de faire quelque chose d'utilisable sur les deux plateformes. En attendant que Fred implémente un jour la gestion des mouseup et mousedown dans les évènements Gadget

Re: Evènements souris
Publié : sam. 19/févr./2011 0:26
par PAPIPP
Bonjour lush
Je ne sais si le prg suivant peut te convenir il fonctionne sous Windows en PB451
Et il permet le déplacement d’un imagegadget
Code : Tout sélectionner
Procedure.q nbcycl()
!RDTSC
ProcedureReturn
EndProcedure
Macro q_t
"
EndMacro
Macro ff_n(n)
q_t#n#=q_t+Str(n)+" "
EndMacro
Macro ff_s(S)
q_t#S#=q_t+S+" "
EndMacro
Macro ff_f(F,nv=8)
q_t#F#=q_t+StrF(f,nv)+" "
EndMacro
Macro ff_d(D,nv=8)
q_t#D#=q_t+StrD(D,nv)+" "
EndMacro
Macro ff_Q(Q)
q_t#Q#=q_t+StrQ(Q)+" "
EndMacro
Macro ff_H(H)
q_t#H#=q_t+Hex(H)+" "
EndMacro
Macro ff_U(U,typ=4)
q_t#U#=q_t+StrU(U,typ)+" "
EndMacro
Macro nl
"**"+Str(#PB_Compiler_Line)+"** "
EndMacro
Enumeration
#f1
#GadgetImage
EndEnumeration
#WM_MOUSEWHEEL=$20A
#WHEEL_DELTA=120
#text=1
If OpenWindow(#f1,10,10,400,400,"Test sur Souris",#PB_Window_SystemMenu)
ImageGadget(#GadgetImage,125,125,150,150,0,#PB_Image_Border)
EndIf
Repeat
Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)+ff_n(WWe)
WWE=WaitWindowEvent(0)
;WE = WindowEvent(); ne pas mettre cette fonction en service sous risque de dysfonctionnement
EF=EventWindow()
Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)+ff_n(WWe)
EG=EventGadget()
Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)+ff_n(WWe)
ET=EventType()
EM=EventMenu()
EWP=EventwParam()
ELP=EventlParam()
Select WWE
Case #PB_Event_CloseWindow
End
Case #WM_LBUTTONDOWN ;"Bouton gauche appuyé")
; Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)
Gosub SEL_GAD_ENFONCE
Case #WM_LBUTTONUP ;"Bouton gauche relaché")
; Debug nl+ff_n(EG)+ff_n(MEG)+ff_n(EventGadget())+ff_n(click_g)
Gosub SEL_GAD_RELACHE
Case #WM_LBUTTONDBLCLK ;"Double clic gauche")
Case #WM_RBUTTONDOWN ;"Bouton droit appuyé")
Case #WM_RBUTTONUP ;"Bouton droit relaché")
Case #WM_RBUTTONDBLCLK ;"Double clic droit")
Case #WM_MBUTTONDOWN ;"Bouton du milieu appuyé"
Case #WM_MBUTTONUP ;"Bouton du milieu relaché")
Case #WM_MBUTTONDBLCLK ;"Double clic du milieu")
Case #WM_MOUSEMOVE
M_X=WindowMouseX(#f1)
M_Y=WindowMouseY(#f1)
If EG_CLIK>0 And click_g=1
NG_X=M_X-D_X0
NG_Y=M_Y-D_Y0
ImageGadget(EG_CLIK,(NG_X),(NG_Y),150,150,0,#PB_Image_Border) ; permet de déplacer imagegadget
; UpdateWindow_(WindowID(#f1))
EndIf
Case #WM_MOUSEWHEEL
Molette.l=-(EWP>>16)/#WHEEL_DELTA
If Molette>0 ;"Molette en avant de
ElseIf Molette<0 ;"Molette en arrière de
EndIf
Case #PB_Event_Gadget
Select ET
Case #PB_EventType_LeftClick ;"Image : Bouton gauche appuyé"
Gosub SEL_GAD_ENFONCE
Case #PB_EventType_LeftDoubleClick ;"Image : Double clic gauche")
Case #PB_EventType_RightClick ;"Image : Bouton Droit appuyé"
Case #PB_EventType_RightDoubleClick ;"Image : Double clic droit")
EndSelect
Case #PB_Event_Repaint
Case #PB_Event_CloseWindow:End
EndSelect
MWWE=WWE
;MWE = WE
MEF=EF
MEG=EG
MET=ET
MEM=EM
MEWP=EWP
ForEver
; routine qui s'execute seulement a l'appuis du bouton gauche sur le gadget !!
SEL_GAD_ENFONCE:
Debug "***************** Routine sur l'appuis du bouton gauche ******************"
G_X=GadgetX(#GadgetImage)
G_Y=GadgetY(#GadgetImage)
M_X=WindowMouseX(#f1)
M_Y=WindowMouseY(#f1)
D_X0=M_X-G_X
D_Y0=M_Y-G_Y
G_larg=GadgetWidth(#GadgetImage)
G_haut=GadgetHeight(#GadgetImage)
click_g=1
EG_CLIK=EG
Return
SEL_GAD_RELACHE:
Debug "***************** routine sur le relachement du bouton gauche ******************"
click_g=0
EG_CLIK=0
Return
Re: Evènements souris
Publié : sam. 19/févr./2011 0:38
par falsam
@papipp : je crois que Lush cherche une solution Cross Platform pour la gestion de la souris.
Re: Evènements souris
Publié : sam. 19/févr./2011 1:38
par lush
@falsam :
Oui, c'est exact. Mais comme certains évènements ne sont pas rapportés via les "gadget events", je pense qu'il va falloir que je me débrouille avec des moyens spécifiques à chaque OS.
@PAPIPP :
Merci, j'ai eu un petit frisson en voyant les GOSUB, mais il y a plein de constantes intéressantes là-dedans (en plus de la méthode de déplacement à la souris).
Y a-t-il un endroit où toutes ces constantes (#WM_*) sont répertoriées ?
Je ne les trouve pas dans le fichier d'aide, et phpBB après avoir viré le # et l'underscore, ne prend pas en compte "WM", ce qui est assez gênant.
Re: Evènements souris
Publié : sam. 19/févr./2011 4:21
par falsam
Re: Evènements souris
Publié : sam. 19/févr./2011 15:21
par PAPIPP
Bonjour lush
Y a-t-il un endroit où toutes ces constantes (#WM_*) sont répertoriées ?
Je ne les trouve pas dans le fichier d'aide, et phpBB après avoir viré le # et l'underscore, ne prend pas en compte "WM", ce qui est assez gênant.
oui SOUS IDE classique de PB en tapant simultanément les touches alt et S ensuite constantes et W
pour les constantes commençant par #W...
Re: Evènements souris
Publié : dim. 20/févr./2011 2:58
par lush
Merci PAPIPP !
J'avais déjà ouvert le visualisateur de structures, mais j'avais complètement zappé l'onglet Constantes...
D'un coup tout devient un peu plus facile
