Evènements de la souris

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Evènements de la souris

Message par omega »

Bonjour

Y a t-il un moyen (évènement) de savoir si la souris a bougé (ou si sa position a changé)??

Merci
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Evènements de la souris

Message par blendman »

Salut

Tu as plusieurs possibilités.

sur la fenêtre avec
eventwindow() : sous windows #WM_MOUSEMOVE

tu peux aussi gérer via les gadgets :
par exemple, sur un canvasgadget()
Eventtype() : #PB_EventType_MouseMove

Sinon, tu mets dans une variable WindowMouseX() et WindowMouseY(), et tu vérifies toutes les secondes si ça a changé.

A+
Mesa
Messages : 1093
Inscription : mer. 14/sept./2011 16:59

Re: Evènements de la souris

Message par Mesa »

Code : Tout sélectionner

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=735&highlight=
; Author: bobobo (updated for PB4.00 by blbltheworm)
; Date: 23. April 2003
; OS: Windows
; Demo: No


;Autor : bobobo 
;----------------------------------------- 
;Tastatur und Mausmessages in Fenstern OHNE directX 
;dafür mit eventwParam und eventLParam (aber nur zur Anzeige für ganz Neugierige) 
;soweit ich weiß wird EventwParam und EventlParam irgendwann nicht mehr unterstützt 
;bis dahin gilt: 
;Solange die Maus im Fensterchen ist gibt es bei Bewegung derselben 
;diverse Mausmessages ..  Und .. Bei aktivem Fenster und Tastaturereignissen 
;gibt's Tastaturmessages (Taste runter und Tastehoch u.s.w.) 

;ömm ja .. Debug aktivieren !! 

OpenWindow(1,0,0,100,100,"Test",#PB_Window_ScreenCentered) 

Debug "Bitte drücken sie eine beliebige Taste!"+Str(rr) 
GetCursorPos_(st.POINT) 
Debug st\x 
Debug st\y 


Repeat 

      Select WaitWindowEvent() 

      Case #WM_MOUSEMOVE 
            Debug "#WM_MOUSEMOVEw " + Str(EventwParam()) 
            Debug "#WM_MOUSEMOVEl " + Str(EventlParam()) 
      Case #WM_LBUTTONDBLCLK  
            Debug "#WM_LBUTTONDBLCLK " + Str(EventwParam()) 
            Debug "#WM_LBUTTONDBLCLK " + Str(EventlParam()) 

      Case #WM_LBUTTONDOWN  
            Debug "#WM_LBUTTONDOWN " + Str(EventwParam()) 
            Debug "#WM_LBUTTONDOWN " + Str(EventlParam()) 

      Case #WM_LBUTTONUP  
            Debug "#WM_LBUTTONUP " + Str(EventwParam()) 
            Debug "#WM_LBUTTONUP " + Str(EventlParam()) 

      Case #WM_RBUTTONDOWN  
            Debug "#WM_RBUTTONDOWN " + Str(EventwParam()) 
            Debug "#WM_RBUTTONDOWN " + Str(EventlParam()) 

      Case #WM_RBUTTONUP 
            Debug "#WM_RBUTTONUP" + Str(EventwParam()) 
            Debug "#WM_RBUTTONUP" + Str(EventlParam()) 

      Case #WM_MBUTTONDBLCLK 
            Debug "#WM_MBUTTONDBLCLK " + Str(EventwParam()) 
            Debug "#WM_MBUTTONDBLCLK " + Str(EventlParam()) 
      Case #WM_MBUTTONDOWN 
            Debug "#WM_MBUTTONDOWN " + Str(EventwParam()) 
            Debug "#WM_MBUTTONDOWN " + Str(EventlParam()) 
      Case #WM_MBUTTONUP 
            Debug "#WM_MBUTTONUP " + Str(EventwParam()) 
            Debug "#WM_MBUTTONUP " + Str(EventlParam()) 
            
      Case #WM_NCMOUSEMOVE 
            Debug "#WM_NCMOUSEMOVE " + Str(EventwParam()) 
            Debug "#WM_NCMOUSEMOVE " + Str(EventlParam()) 

      Case #WM_NCLBUTTONDBLCLK 
            Debug "#WM_NCLBUTTONDBLCLK " + Str(EventwParam()) 
            Debug "#WM_NCLBUTTONDBLCLK " + Str(EventlParam()) 



      Case #WM_ACTIVATE 
            Debug "#WM_ACTIVATE " +Str(EventwParam()) 
            Debug "#WM_ACTIVATE " +Str(EventlParam()) 
      Case #WM_CHAR 
            Debug "#CHAR w:    " + Str(EventwParam()) 
            Debug "#CHAR l:    " + Str(EventlParam()) 
      Case #WM_DEADCHAR 
            Debug "#DEADCHAR:   " + Str(EventwParam()) 
      Case #WM_KEYDOWN 
            Debug "#KEYDOWN(w): " + Str(EventwParam()) 
            Debug "#KEYDOWN(l): " + Str(EventlParam()) 
      Case #WM_KEYUP 
            Debug "#KEYUP(w):   " + Str(EventwParam()) 
            Debug "#KEYUP(l):   " + Str(EventlParam()) 
      Case #WM_SYSCHAR 
            Debug "#SYSCHAR:   " + Str(EventwParam()) 
      Case #WM_SYSDEADCHAR  
            Debug "#SYDEADSCHAR:   " + Str(EventwParam()) 
      Case #WM_SYSKEYDOWN 
            Debug "#SYSKEYDOWN:   " + Str(EventwParam()) 
      Case #WM_SYSKEYUP 
            Debug "#SYSKEYUP:   " + Str(EventwParam()) 
      EndSelect 
      Debug "-----------------" 
ForEver 
End 


M.
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Evènements de la souris

Message par microdevweb »

Pour ma part le plus simple est d'utilisé un canvas qui permet la gestion de tous les événement souris.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
case
Messages : 1527
Inscription : lun. 10/sept./2007 11:13

Re: Evènements de la souris

Message par case »

microdevweb a écrit :Pour ma part le plus simple est d'utilisé un canvas qui permet la gestion de tous les événement souris.

sauf si tu veux savoir si la souris a bouger en dehors de ta fenêtre en l'occurrence on ne sais pas :)
ImageImage
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Evènements de la souris

Message par kernadec »

bjr à tous
Voici un autre exemple de dessin souris avec coordonnées en Titre
Cordialement

Code : Tout sélectionner

OpenWindow(0, 0, 0, 600, 600, "Simulation Dessin Lasso", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

xy_depart = 0

Repeat
  
  Event = WaitWindowEvent()
  
  Select Event
      
    Case #PB_Event_CloseWindow
      
      Break
      
    Case #WM_LBUTTONDOWN
      
      If xy_depart = 0                       ; stock point de depart xy de boucle
        x1 = WindowMouseX(0)
        y1 = WindowMouseY(0)
        xy_depart = 1 
      EndIf
      
      dessiner = #True                       ; lasso debut 
      
    Case #WM_LBUTTONUP                       
      
      If xy_depart = 1       
        If  StartDrawing(WindowOutput(0))
          LineXY(x1, y1, x3, y3, $0000FF)      ; raccorde debut et fin de boucle
          StopDrawing() 
        EndIf 
        xy_depart = 0
      EndIf
      
      dessiner = #False                      ; fin de boucle
      
    Default
      
      x3 = WindowMouseX(0)
      y3 = WindowMouseY(0)
      
      SetWindowTitle(0,"Simulation Dessin Lasso:   " + "X " + Str(x3) + ", "  + "Y " +  Str(y3))
      
      If  x3 <> -1  Or  y3 <> -1             ; souris hors fenetre mais la boucle continue
        
        If StartDrawing(WindowOutput(0))
          If dessiner = #True 
            LineXY(x2, y2, x3, y3, $0000FF)
          EndIf
          StopDrawing()
        EndIf
        
        x2 = x3                              ;  transfer x3 en x2 
        y2 = y3                              ;  transfer y3 en y2 
        
      EndIf
      
  EndSelect
  
ForEver

End
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Evènements de la souris

Message par kernadec »

bjr à tous
j'ai retrouvé ce code d’événements souris intéressant.
en faisant une recherche sur les trois forums avec "Event_WindowsMouseMove = $200"
pas vu ce code...
donc, je ne sais plus comment il s'est retrouvé dans mes archives :mrgreen:
Auteur: Erlend - NORWAY
Cordialement

Code : Tout sélectionner

;https://www.purebasic.fr/english/viewtopic.php?p=328543#p328543
; correction Demivec chevaucement n'efface plus le polygone precedent
;auteur: Erlend - NORWAY

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    #PB_Event_WindowsMouseMove = $200
  CompilerCase #PB_OS_Linux
    #PB_Event_WindowsMouseMove = -1
  CompilerCase #PB_OS_MacOS
    #PB_Event_WindowsMouseMove = 0
CompilerEndSelect


Structure pippoint
  x.l
  y.l
EndStructure

Procedure FilledPolygon(List points.pippoint(),Color)
  NewList nodes.i()
  ;Find least and most y values to restrict area to transverse when filling..
  ResetList(points())
  miny=OutputHeight()-1
  maxy=0
  While NextElement(points())
    If points()\y<miny:miny=points()\y:EndIf
    If points()\y>maxy:maxy=points()\y:EndIf
  Wend
  
  For cy=miny To maxy
    x.f=cx
    y.f=cy
    oddnodes=#False
    ClearList(nodes())
    LastElement(points())
    x1.f=points()\x
    y1.f=points()\y
    ResetList(points())
    While NextElement(points())
      x2.f=points()\x
      y2.f=points()\y
      If ((y2<y) And y1>=y) Or (y1<y And y2>=y)
        AddElement(nodes())
        nodes()=(x2+(y-y2) / (y1-y2) * (x1-x2))
      EndIf
      x1=x2
      y1=y2
    Wend
    SortList(nodes(),#PB_Sort_Ascending)
    ResetList(nodes())
    While NextElement(nodes())
      x1=nodes()
      NextElement(nodes())
      x2=nodes()
      LineXY(x1,y,x2,y,Color)
    Wend
  Next
  FirstElement(points())
  oldx=points()\x
  oldy=points()\y
  While NextElement(points())
    LineXY(oldx,oldy,points()\x,points()\y,Color)
    oldx=points()\x
    oldy=points()\y
  Wend
EndProcedure


NewList mpp.pippoint()

OpenWindow(0, 0, 0, 640, 480, "Filled Polygon", #PB_Window_SystemMenu)

CreateImage(0, 640, 480)
StartDrawing(ImageOutput(0))
  Box(0, 0, 640, 480, 0)
StopDrawing()
ImageGadget(0, 0, 0, 640, 480, ImageID(0))

exit = #False
Repeat
  
  event = WaitWindowEvent()
  
  ;  Debug Event
  
  Select event
    Case #PB_Event_WindowsMouseMove
      If ListSize(mpp()) > 0
        SelectElement(mpp(), ListSize(mpp()) - 1)
        StartDrawing(ImageOutput(0))
          DrawingMode(#PB_2DDrawing_XOr)
          LineXY(mpp()\x, mpp()\y, MouseX, MouseY, $FFFFFF) ;remove last line drawn
          MouseX = WindowMouseX(0)
          MouseY = WindowMouseY(0)       
          LineXY(mpp()\x, mpp()\y, MouseX, MouseY, $FFFFFF) ;add a new line
        StopDrawing()
        SetGadgetState(0, ImageID(0))
      Else
        MouseX = WindowMouseX(0)
        MouseY = WindowMouseY(0)
      EndIf
      
    Case #PB_Event_Gadget
      If EventGadget() = 0
        Select EventType()
          Case #PB_EventType_RightClick
            If ListSize(mpp()) > 2
              StartDrawing(ImageOutput(0))
                SelectElement(mpp(), ListSize(mpp()) - 1)
                ;DrawingMode(#PB_2DDrawing_XOr) ;uncomment this line for an interesting visual effect
                LineXY(mpp()\x, mpp()\y, MouseX, MouseY, $0)
                FilledPolygon(mpp(),RGB(Random(220) + 35, Random(220) + 35, Random(220) + 35))
              StopDrawing()
              SetGadgetState(0, ImageID(0))
              ClearList(mpp())
            EndIf
          Case #PB_EventType_LeftClick
            MouseX = WindowMouseX(0)
            MouseY = WindowMouseY(0)
            If ListSize(mpp()) > 0
              SetGadgetState(0, ImageID(0))
            EndIf
            AddElement(mpp())
            mpp()\x = MouseX
            mpp()\y = MouseY
        EndSelect
      EndIf
    Case #PB_Event_CloseWindow
      exit = #True
  EndSelect
Until exit
Dernière modification par kernadec le jeu. 15/avr./2021 15:54, modifié 1 fois.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Evènements de la souris

Message par blendman »

super !

Merci beaucoup
je vais peut-être l'utiliser pour les sélections polygonales je pense (ainsi que le remplissage polygonale)
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Evènements de la souris

Message par kernadec »

bjr à tous
Le code précédent Filled Polygon à été mis jours
j'ai retrouvé le post du code Filled Polygon qui est de juillet 2010
donc car "Demivec" avait fait une correction pour que le polygone
inférieur ne soit pas effacé par la construction d'un autre polygone
au premier plan. :wink:
Cordialement
Répondre