problème relachement de la souris
-
- Messages : 64
- Inscription : lun. 07/févr./2005 11:18
problème relachement de la souris
J'ai un soucis pour la détection du relachement du bouton de la souris. Je ne veux pas passer par examinemouse() parce que je ne travaille pas avec un écran. Je detecte l'appuie du bouton, ensuite je rentre dans une boucle et je veux sortir dès que le bouton est relaché. Je teste Event=#WM_LBUTTONUP. Le problème c'est que cela ne marche pas tous le temps. C'est un peu chaotique. J'ai essayé de multiplier les tests Event=#WM_LBUTTONUP dans la boucle mais cela n'a rien donné. Il y a t'il un moyen de tester l'état des boutons sans passer par examinemouse???
Salut Christophe,
Il y a un super Tutoriel sur la souris...
http://purebasic.hmt-forum.com/viewtopic.php?t=1310
Il y a un super Tutoriel sur la souris...
http://purebasic.hmt-forum.com/viewtopic.php?t=1310

-
- Messages : 64
- Inscription : lun. 07/févr./2005 11:18
ceci peut peut-etre t'aider :
ou çà :
Code : Tout sélectionner
If OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
If CreateGadgetList(WindowID(0))
ButtonGadget(0, 5, 5, 50, 50, "0")
ButtonGadget(1, 5, 60, 50, 50, "1")
ButtonGadget(2, 60, 5, 50, 50, "2")
ButtonGadget(3, 60, 60, 50, 50, "3")
TextGadget( 4, 5, 120,200, 20, "4", #PB_Text_Border)
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #WM_MOUSEMOVE
hWnd = ChildWindowFromPoint_(WindowID(0), WindowMouseX(0), WindowMouseY(0))
If hWnd
SetGadgetText(4, "GadgetID(" + Str(GetDlgCtrlID_(hWnd)) + ")=" + Hex(hwnd))
EndIf
EndSelect
ForEver
EndIf
Code : Tout sélectionner
Define.RECT r, old
Define.l hWnd, brush
If OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetWindowColor(0, #White)
hWnd = WindowID(0)
brush = GetStockObject_(#WHITE_BRUSH)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #WM_LBUTTONDOWN
SetCapture_(hWnd)
r\left = WindowMouseX(0)
r\top = WindowMouseY(0)
Case #WM_LBUTTONUP
InvalidateRect_(hWnd, #Null, #True)
ReleaseCapture_()
Case #WM_MOUSEMOVE
If EventwParam() & #MK_LBUTTON
hDC = GetDC_(hWnd)
If hDC
r\right = WindowMouseX(0)
r\bottom = WindowMouseY(0)
FrameRect_(hDC, old, brush)
DrawFocusRect_(hDC, r)
SetRect_(old, r\left, r\top, r\right, r\bottom)
ReleaseDC_(hWnd, hDC)
EndIf
EndIf
EndSelect
ForEver
DeleteObject_(brush)
EndIf
-
- Messages : 64
- Inscription : lun. 07/févr./2005 11:18
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
oui, si on relache le bouton hors de la fnêtre, on ne verra pas l'évènement.
ce qui est normal car l'évènement de la souris est renvoyé vers l'application se trouvant dessous.
Après, quand on appuie sur le bouton de la souris, on peut définir une zone dans laquelle la souris doit rester, cela oblige a l'utilisateur de relacher le bouton de la souris quand celle ci est sur la fenêtre
regarde ceci
ce qui est normal car l'évènement de la souris est renvoyé vers l'application se trouvant dessous.
Après, quand on appuie sur le bouton de la souris, on peut définir une zone dans laquelle la souris doit rester, cela oblige a l'utilisateur de relacher le bouton de la souris quand celle ci est sur la fenêtre
regarde ceci
Code : Tout sélectionner
; récupère les coordonnées de la zone du curseur
GetClipCursor_(rc_Org.RECT)
; définitions de la nouvelle zone de déplacement du curseur
rc.RECT\left = 300
rc\top = 100
rc\right = 300 + 200
rc\bottom = 100 + 200
ClipCursor_(rc)
; restaure la zone d'origine
ClipCursor_(rc_Org)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
-
- Messages : 64
- Inscription : lun. 07/févr./2005 11:18
Impeccable. C'est très utile, utilisé avec
qui donne la position absolu d'un gadget, ça permet de contraindre la souris dans le gadget.
Par contre, pour mon problème de laché de bouton, comme je fais l'examen en fin d'une boucle où il se passe pas mal de chose, j'ai été obligé d'utiliser une fonction qui vide régulierement la pile en examinant le laché, et ceci plusieurs fois dans la boucle. Quasiment, après chaque gros calcul.. Ca marche un peu près..
Voilà la procedure, elle vide la pile des evenements accumulés (pendant un calcul par exemple) et renvoie 1 si l'evenement (#WM_LBUTTONUP pour moi) est dans la pile
Cette procedure est appelé plusieurs fois dans la boucle par
on examine sortie en fin de boucle...
Ca marche, mais il y a surement plus simple...
Merci une fois de plus au soldat inconnu. Tes trouvailles mon déjà été très utiles..
Code : Tout sélectionner
GetWindowRect_(GadgetID(2),Rect2.rect)
Par contre, pour mon problème de laché de bouton, comme je fais l'examen en fin d'une boucle où il se passe pas mal de chose, j'ai été obligé d'utiliser une fonction qui vide régulierement la pile en examinant le laché, et ceci plusieurs fois dans la boucle. Quasiment, après chaque gros calcul.. Ca marche un peu près..
Voilà la procedure, elle vide la pile des evenements accumulés (pendant un calcul par exemple) et renvoie 1 si l'evenement (#WM_LBUTTONUP pour moi) est dans la pile
Code : Tout sélectionner
Procedure VidePileEvenement(Evt1.l)
Protected resultat.l,evenement.l
resultat.l=0
Debug "debut vide pile"
Repeat
evenement=WindowEvent()
Debug evenement
If evenement=Evt1
resultat=1
Debug "détection dans le vide pile"
EndIf
Until evenement=0
Debug "fin vide pile"
ProcedureReturn resultat
EndProcedure
Code : Tout sélectionner
If VidePileEvenement(#WM_LBUTTONUP):sortie=1:EndIf
Ca marche, mais il y a surement plus simple...
Merci une fois de plus au soldat inconnu. Tes trouvailles mon déjà été très utiles..