Survol gadget

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Mesa
Messages : 1093
Inscription : mer. 14/sept./2011 16:59

Survol gadget

Message 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.
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Survol gadget

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Survol gadget

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Survol gadget

Message 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)

Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Survol gadget

Message par graph100 »

c'est intéressant :

Code : Tout sélectionner

GetDlgCtrlID_()
C'est une API, ou bien une fonction interne de PB ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Survol gadget

Message par MLD »

Il me semble une API :?:
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: Survol gadget

Message par Fred »

Tout ce qui se termine par "_" est une API ou fonction externe
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Survol gadget

Message 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 ================ 
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Survol gadget

Message 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.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Survol gadget

Message 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)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre