Page 1 sur 1

Survol gadget

Publié : ven. 04/avr./2014 11:06
par Mesa
Je fais remonter un code du forum anglais, qui n'est pas de moi.

Il permet de récupérer le numéro du gadget en le survolant. Il existe déjà plusieurs codes pour faire cela mais ici, l’intéressant est l'usage de la fonction PostEvent()

Code : Tout sélectionner

Procedure EventMouse(Gadget,Window=-1)
	Protected  x.l, y.l, w.l, h.l, mx.l, my.l
	Static OldGadget,NewGadget,wIn,gIn,IGadget
;-------------------------------     
		;Curseur coordonnées stockées dans la variable
		mx =DesktopMouseX() 
		my =DesktopMouseY()
		If IsGadget(Gadget) ;  
		x=GadgetX(Gadget,#PB_Gadget_ScreenCoordinate)
		y=GadgetY(Gadget,#PB_Gadget_ScreenCoordinate)
		w=GadgetWidth(Gadget)
		h=GadgetHeight(Gadget)
		EndIf
		If (mx >= x And mx <= (x+w) And my >= y And my <= (y+h)) ;Si le pointeur de la souris sur le gadget
			If gIn=#False And IGadget<>Gadget  :gIn=#True ;Dans la form
				;Debug "from window"
				PostEvent(#PB_Event_Gadget,EventWindow(),Gadget, #PB_EventType_MouseEnter)
				IGadget=Gadget
				NewGadget=Gadget
				OldGadget=Gadget
			EndIf
			If NewGadget<>Gadget And IGadget=#False ;Si gadget
			;Debug "from gadget"
			PostEvent(#PB_Event_Gadget,EventWindow(),Gadget, #PB_EventType_MouseEnter)
				NewGadget=Gadget
				If OldGadget<>NewGadget And gIn=#True;Indiquent que nous sommes sur la forme
				;Debug "on gadget"
				PostEvent(#PB_Event_Gadget,EventWindow(),OldGadget, #PB_EventType_MouseLeave)
				OldGadget=NewGadget
			EndIf
			EndIf
		Else
			If IsGadget(NewGadget) ;  
			x=GadgetX(NewGadget,#PB_Gadget_ScreenCoordinate)
			y=GadgetY(NewGadget,#PB_Gadget_ScreenCoordinate)
			w=GadgetWidth(NewGadget)
			h=GadgetHeight(NewGadget)
			EndIf
			If (mx < x Or mx > (x+w) Or my < y Or my > (y+h)) ;Si le pointeur de la souris gadget nahotitsya l'extérieur
			If gIn=#True :gIn=#False ;Indiquent que nous sommes sur la forme
				;Debug "on window"
				PostEvent(#PB_Event_Gadget,EventWindow(),newGadget, #PB_EventType_MouseLeave)
				IGadget=#False
				OldGadget=NewGadget
		EndIf
		
		EndIf
		
		EndIf
		
	EndProcedure


win1 = OpenWindow(#PB_Any,0,0,400,300,"Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered| #PB_Window_SizeGadget)
			ButtonGadget(3,10,20,62,22,"" )
			ButtonGadget(4,150,20,62,22,"" )
				
				ContainerGadget(5,10,220,62,22,#PB_Container_Flat )
				CloseGadgetList()

				Repeat
					EventMouse(3)
					EventMouse(4)
					EventMouse(5)
					
					Select WaitWindowEvent()
							
				Case #PB_Event_Gadget
					Debug EventGadget()
							Case #PB_Event_CloseWindow
										Quit = 1     
										
					EndSelect

				Until Quit = 1
				End
(C'est un code perfectible)

M.

Re: Survol gadget

Publié : ven. 04/avr./2014 13:12
par GallyHC
Bonjour,

Perso j'utilise cela qui est plus simple

Code : Tout sélectionner

Procedure GadgetHoverCheck(x, y, Gadget)
; ROUTINE DE VERIFICATION DES POSITIONS GADGETS.
  If IsGadget(Gadget) <> 0
    ProcedureReturn Bool(((Not x<GadgetX(Gadget)) And (Not y<GadgetY(Gadget))) And (Not x>=(GadgetX(Gadget)+GadgetWidth(Gadget))) And (Not y>=(GadgetY(Gadget)+GadgetHeight(gadget))))
  EndIf

EndProcedure
Cordialement,
GallyHC

Re: Survol gadget

Publié : mer. 20/août/2014 15:26
par Ar-S
ça reste bordélique de devoir toujours gérer le survol des buttongadget avec leurs coordonnées.
Lorsqu'on a plein de boutons c'est la misère. Une surcouche avec une détection des boutons au survol souris sans avoir à mettre 1 page de code feraient quand même du bien.

Re: Survol gadget

Publié : mer. 20/août/2014 16:00
par MLD
Sous Windows il ya les Hooks
J'utilise ceci (ce n'est pas de moi, je ne me rappel plus de qui?)

Code : Tout sélectionner

;Global PbIdGadgetSurvoler

Procedure HookProc(nCode,wParam,lParam)
GetCursorPos_(@point.POINT) 
Handle = WindowFromPoint_(Point\X | (Point\Y << 32))
ParentHandle = GetParent_(Handle)
PbIdGadgetSurvoler = GetDlgCtrlID_(Handle) ; PbId du gadget survolé

;If PbIdGadgetSurvoler <> -1 And PbIdGadgetSurvoler <> 0
Debug PbIdGadgetSurvoler
;Else 
;Debug GetDlgCtrlID_(ParentHandle)
;EndIf

;ProcedureReturn CallNextHookEx_(0,nCode,wParam,lParam)

EndProcedure

OpenWindow(10,0,0,640, 300,"Mouse+Keyboard Block",#WS_CAPTION | #WS_SYSMENU | 1)
ScrollAreaGadget(6, 0,0,640,300,1000,1000)
ContainerGadget(5, 0, 0, 340, 300,#PB_Container_Single  )
TextGadget    (10,  10,  10, 100, 16, "ListIcon Standard", #PB_Text_Center) 
SetWindowLong_(GadgetID(10), #GWL_STYLE, GetWindowLong_(GadgetID(10), #GWL_STYLE)|#SS_NOTIFY)
ListIconGadget(1,  10,  35, 300, 70, "Column 1", 100) 
TextGadget    (2,  10, 125, 120, 16, "ListIcon with Checkbox", #PB_Text_Center) 
SetWindowLong_(GadgetID(2), #GWL_STYLE, GetWindowLong_(GadgetID(2), #GWL_STYLE)|#SS_NOTIFY)
ListIconGadget(3,  10, 150, 300, 70, "Column 1", 100, #PB_ListIcon_CheckBoxes)  
ButtonGadget  (4, 10, 230, 100, 20, "Add Gadget")
CloseGadgetList()
CloseGadgetList()

StickyWindow(10,1)

hhkLLMouse = SetWindowsHookEx_(#WH_MOUSE_LL,@HookProc(),GetModuleHandle_(0),0)

Repeat
   EventID = WaitWindowEvent()
Until EventID = #PB_Event_CloseWindow 

UnhookWindowsHookEx_(hhkLLMouse)


Re: Survol gadget

Publié : mer. 20/août/2014 16:14
par graph100
c'est intéressant :

Code : Tout sélectionner

GetDlgCtrlID_()
C'est une API, ou bien une fonction interne de PB ?

Re: Survol gadget

Publié : mer. 20/août/2014 16:39
par MLD
Il me semble une API :?:

Re: Survol gadget

Publié : mer. 20/août/2014 16:51
par Fred
Tout ce qui se termine par "_" est une API ou fonction externe

Re: Survol gadget

Publié : jeu. 21/août/2014 6:55
par Ar-S
J'ai trouvé une solution de Netmaestro qui me convient.

Code : Tout sélectionner

Procedure GetCurrentButton(window)
  Protected currentbutton = -1
  For thisbutton = #BT_FF To #BT_BTSync
    br.RECT
    br\left   =           GadgetX      ( thisbutton )
    br\top    =           GadgetY      ( thisbutton )
    br\right  = br\left + GadgetWidth  ( thisbutton )
    br\bottom = br\top  + GadgetHeight ( thisbutton )
    If WindowMouseX(window) >= br\left And WindowMouseX(window) <= br\right
      If WindowMouseY(window) >= br\top And WindowMouseY(window) <= br\bottom
        currentbutton = thisbutton
        Break
      EndIf
    EndIf
  Next
  ProcedureReturn currentbutton
EndProcedure 

dans la boucle principale

Code : Tout sélectionner

; j'ai fait qques modifs ici
; =========== Mouseover Button Section =================
  currentbutton = GetCurrentButton(#ldvm)
  If currentbutton <> oldButton 
  	If currentbutton > -1 And currentbutton < 12
  		Debug currentbutton
    	SetGadgetText(#info, app(currentbutton)\info)
    	oldButton = currentbutton
  	EndIf
  EndIf		
  ; ======== End Mouseover Button Section ================ 

Re: Survol gadget

Publié : jeu. 21/août/2014 10:57
par graph100
pour que cela fonctionne il faut que tu alloues tes gadgets statiquement, et à la suite.
Ca ne marche pas avec l'allocation dynamique, à moins de faire une map qui fait la correspondance. Un peu long !

@Fred : il n'y aurait pas moyen d'avoir une(la) liste chainée contenant tous les gadgets. accessible dans le code.
En gros d'avoir accès à la gadgetliste(). Il ne me semble pas que opengadetlist() permette de lister les gadgets.

Re: Survol gadget

Publié : jeu. 21/août/2014 22:22
par Ar-S
Dans mon exemple, j'ai une tableau structuré avec (pour faire court) l'ID du gadget et un String contenant la description du gadget.
Lorsque je survol mes boutons, j'ai le descriptif adéquate qui apparait dans un editor. ça marche au poil.
Je posterai mon code complet dans application, je fais un genre de Loadtool avec les programmes que je préfère et que j'installe souvent chez mes clients, ça permet de se rendre sur les page de télechargement rapidement.
(Pas eu le temps aujourd'hui j'ai brassé 2m cube de terre dans mon jardin)