Page 1 sur 1

mouse fly over button

Publié : lun. 15/août/2016 21:05
par YvesRossignol
Bonjour, je me demande si il y a une fonction pour vérifier si la souris est au-dessus d'une section de l'écran (un bouton) car j'aimerais montrer une image en fonction de quel bouton est survolé.

Merci de votre aide. J'ai cherché mais j'ai pas trouvé dans le forum

Yves R

Re: mouse fly over button

Publié : lun. 15/août/2016 21:56
par falsam
Cliquer sur un bouton c'est en natif avec PureBasic par contre survoler un bouton n'est pas natif et c'est dommage car on visualise bien que ce bouton nous nargue avec sa surbrillance au moment du survol.

On va se débrouiller avec par exemple des API Windows.

Code : Tout sélectionner

Enumeration window
  #mainForm
EndEnumeration

Enumeration gadget
  #button1
  #button2
EndEnumeration
  
Declare isMouseOver(window, gadget)

OpenWindow(#mainForm, 0, 0, 400, 150, "Mouse Over", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#button1, 10, 10, 380, 20,"Button 1")
ButtonGadget(#button2, 10, 40, 380, 20,"Button 2")

Repeat     
  Event = WindowEvent()
  
  If isMouseOver(#mainform, #button1) 
    Debug "button1"
  EndIf
  
  If isMouseOver(#mainform, #button2) 
    Debug "button2"
  EndIf
    
Until Event = #PB_Event_CloseWindow

Procedure isMouseOver(window, gadget)
  Static currentGadget
  
  GetCursorPos_ (@p.POINT) 
  ScreenToClient_ (WindowID(window), @p)              
  overgadget = ChildWindowFromPoint_ (WindowID(window), p\y << 32 + p\x)
  If overgadget = GadgetID(gadget) And overgadget <> currentGadget
    currentGadget = overgadget
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf    
EndProcedure
Mouse over the button or some where over the rainbow ? guess my choice ....
https://www.youtube.com/watch?v=V1bFr2SWP1I

Re: mouse fly over button

Publié : mar. 16/août/2016 7:45
par Zorro
autre technique ,une seule Api , marche aussi sur tout gadgets survolés

Code : Tout sélectionner

; Détecte le passage de la souris au dessus d'un Gadget
; on peut ainsi récupérer son ID ou son Handle
; il faut que l'ID du Gadget commence par 1
; car le message renvoie null s'il n'est pas au dessus un Gadget
; de plus si le gadget est désactivée, il ne sera pas détecté
Declare  Callback(WindowID, message, wParam, lParam)
Enumeration
		#window
		;#String          ;ID=1
		#Button         ;ID=2
		#CheckBox    ;ID=3
		#String
EndEnumeration
;
If OpenWindow(#window,0,0,400,400,"Pure Basic",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
		SetWindowCallback(@Callback())
		CreateGadgetList(WindowID(#window))
		StringGadget(#String,20, 20,200,20,"Normal StringGadget...")
		ButtonGadget(#Button, 20, 60, 200, 20, "Standard Button")
		CheckBoxGadget(#CheckBox,20, 100,200,20,"CheckBox standard")
		Repeat
				EventID.l=WaitWindowEvent(10)
				Select EventID
				Case #PB_Event_Gadget
						Select EventGadget()
						Case 0
						EndSelect
				Endselect
		Until EventID.l=#PB_Event_CloseWindow
EndIf  
;
Procedure Callback(WindowID, message, wParam, lParam)
		Resultat = #PB_ProcessPureBasicEvents
		Select message
		Case #WM_SETCURSOR
				Debug "Handle= "+Str(wParam)+"   , "+"ID= "+Str(GetDlgCtrlID_(wParam))
		EndSelect
		ProcedureReturn Resultat
EndProcedure
; Epb


Ps : une recherche sur les forums avec le terme "mouse Over" t'aurai apporté moultes réponses :)