en gros je vois ça comme ça...
à approfondir, je n'ai pas traité les gadgets inclus dans un container ou un panel...
bon, c'est pas tout ça, j'ai des monstres à tuer moi monsieur...
Code : Tout sélectionner
;{ constantes
Enumeration
#FEN_MAIN
EndEnumeration
Enumeration 1
#GDT_PgnG
#GDT_PgnD
#GDT_PgnH
#GDT_PgnB
;----------------
EndEnumeration
#GDT_PoigneeTaille = 6
#GDT_PoigneeCouleur = $0000ff
#GDT_PoigneeCache = 1
#GDT_PoigneeMontre = 0
#WindowWidth = 390
#WindowHeight = 350
;}
;{ structures
Structure objet_graphique
x.l ; coordonnées d'insertion
y.l
cx.l ; centre du gadget
cy.l
largeur.l
hauteur.l
text.s
type.l ; = #PB_GadgetType_*
handle.l ; obtenu par #pb_any
group_id.l ; permet de connaitre l'id du "groupe" container / panel / scrollarea ...
group_num.l ; pour le panel, de quelle "page", il dépend
group_type.l ; renvoie #PB_GadgetType_Panel ,#PB_GadgetType_Container , #PB_GadgetType_ScrollArea
EndStructure
;}
;{ variables
Global NewList lstObjet.objet_graphique()
Global Dim GROUPE_ACTIF.l(1) ; 0=groupe_id / 1=groupe_type
Global NUMERO_PANEL_ACTIF.l ; group_num
Global mx.l,my.l
;--- initialisation des variables
GROUPE_ACTIF(0)=-1 : GROUPE_ACTIF(1)=-1 ; 0=groupe_id / 1=groupe_type
NUMERO_PANEL_ACTIF=-1 ; group_num
;}
; dans la boucle des événements
; au moment du clique regarder la position du curseur par rapport à tout les objets dans la table
; affiner la recherche au plus près (distance la plus courte entre curseur/centre-objet)
; pour rejeter les objet du type container, scrollarea, onglet
; peut être voir une routine qui écarte les objets trop loin du curseur (distance curseur /centre-objet)
; distance pouvant être "adaptée" au besoin.
Procedure CurseurInfo(px.l,py.l)
Debug "X: "+Str(px)+" - Y: "+Str(py)
EndProcedure
Procedure.l AjouteGadget(phandle.l) ;,ptype.l,px.l,py.l,plargeur.l,phauteur.l)
AddElement(lstObjet())
With lstObjet()
\x = GadgetX(phandle)
\y = GadgetY(phandle)
\largeur = GadgetWidth(phandle)
\hauteur = GadgetHeight(phandle)
\cx = \x+(\largeur/2)
\cy = \y+(\hauteur/2)
\text = GetGadgetText(phandle)
\type = GadgetType(phandle)
\handle = phandle
\group_id = GROUPE_ACTIF(0)
\group_num = NUMERO_PANEL_ACTIF
\group_type = GROUPE_ACTIF(1)
EndWith
ProcedureReturn phandle
EndProcedure
; Distance entre deux points
Procedure.f Distance(x1.l,y1.l,x2.l,y2.l)
; (x1|y1) = coordonnées XY du point n°1
; (x2|y2) = coordonnées XY du point n°2
ProcedureReturn Sqr(Pow(x1-x2,2) + Pow(y1-y2,2))
EndProcedure
Procedure.s ChercheGadget(px.l,py.l) ;=coordonnées du curseur souris
Protected cdistance_centre.f,cdistance_xy.f ; c comme courant
Protected sdistance_centre.f,sdistance_xy.f ; s comme sauver
Protected flag.b=1 ; sert à initialiser le bazar
Protected numero_objet = -1, text.s
Debug "begin-----------------------"
ForEach lstObjet()
cdistance_centre = Distance(lstObjet()\cx,lstObjet()\cy,px,py)
cdistance_xy = Distance(lstObjet()\x,lstObjet()\y,px,py)
If flag = 1
sdistance_centre=cdistance_centre
sdistance_xy=cdistance_xy
flag = 0
EndIf
; si distance_centre est inférieur à la derniere distance stockée alors elle devient la distance courante
If cdistance_centre < sdistance_centre And cdistance_xy < sdistance_xy
sdistance_centre=cdistance_centre
sdistance_xy=cdistance_xy
numero_objet = ListIndex(lstObjet())
text = lstObjet()\text
EndIf
Debug "du curseur au centre = "+StrF(cdistance_centre,2)+" au coin haut gauche = "+StrF(cdistance_xy,2)
; X: 386 - Y: 133
; du curseur au centre = 192.26 au coin haut gauche = 395.61
; du curseur au centre = 281.14 au coin haut gauche = 380.22
; du curseur au centre = 156.24 au coin haut gauche = 192.82
; du curseur au centre = 106.33 au coin haut gauche = 137.44
; du curseur au centre = 200.88 au coin haut gauche = 372.26
; du curseur au centre = 320.32 au coin haut gauche = 419.93
; du curseur au centre = 200.96 au coin haut gauche = 204.88
Next
Debug "end----------------------"
Debug "du curseur au centre = "+StrF(sdistance_centre,2)+" au coin haut gauche = "+StrF(sdistance_xy,2)
ProcedureReturn text ;numero_objet
EndProcedure
Procedure Execute_FEN_MAIN()
If OpenWindow(#FEN_MAIN, 100, 200, #WindowWidth, #WindowHeight, "PureBasic - Gadget Demonstration", #PB_Window_MinimizeGadget)
;{ création des gadgets
TextGadget(#GDT_PgnG,-100,0,#GDT_PoigneeTaille,#GDT_PoigneeTaille,""):SetGadgetColor(#GDT_PgnG,#PB_Gadget_BackColor,#GDT_PoigneeCouleur)
TextGadget(#GDT_PgnD,-100,0,#GDT_PoigneeTaille,#GDT_PoigneeTaille,""):SetGadgetColor(#GDT_PgnD,#PB_Gadget_BackColor,#GDT_PoigneeCouleur)
TextGadget(#GDT_PgnH,-100,0,#GDT_PoigneeTaille,#GDT_PoigneeTaille,""):SetGadgetColor(#GDT_PgnH,#PB_Gadget_BackColor,#GDT_PoigneeCouleur)
TextGadget(#GDT_PgnB,-100,0,#GDT_PoigneeTaille,#GDT_PoigneeTaille,""):SetGadgetColor(#GDT_PgnB,#PB_Gadget_BackColor,#GDT_PoigneeCouleur)
Top = 10
GadgetHeight = 24
AjouteGadget(Frame3DGadget(#PB_Any, 10, Top, 370, 290, "Player...")): Top+20
AjouteGadget(StringGadget(#PB_Any, 20, Top, 200, GadgetHeight, ""))
AjouteGadget(ButtonGadget(#PB_Any, 223, Top, 72, GadgetHeight, "Play"))
AjouteGadget(ButtonGadget(#PB_Any, 295, Top, 72, GadgetHeight, "Stop")) : Top+35
;DisableGadget(2,1)
;GadgetToolTip(1,"Play the current song")
GROUPE_ACTIF(0) = AjouteGadget(PanelGadget(#PB_Any, 20, Top, #WindowWidth-50, #WindowHeight-Top-60))
GROUPE_ACTIF(1) = #PB_GadgetType_Panel
; AddGadgetItem(3, 0, "MP3 PlayList")
; ListViewGadget(4, 6, 10, 230, 148)
;
; For k=0 To 30
; AddGadgetItem(4, -1, "Music Song n° "+Str(k))
; Next
;
; ButtonGadget(5, 250, 10, 80, GadgetHeight, "Add")
; ButtonGadget(6, 250, 38, 80, GadgetHeight, "Remove")
; ButtonGadget(7, 250, 66, 80, GadgetHeight, "Select")
; GadgetToolTip(7, "Select the current song")
;
; TrackBarGadget(17, 10, 168, 310, 25, 0, 100)
;
; AddGadgetItem(3, 1, "Options")
; Top = 10
; CheckBoxGadget(10, 10, Top, 250, GadgetHeight, "Enable low-pass filter") : Top+30
; CheckBoxGadget(11, 10, Top, 250, GadgetHeight, "Enable visual plug-in") : Top+30
; ComboBoxGadget(12, 10, Top, 250, 21) : Top+30
; AddGadgetItem(12, -1, "FireWorks")
; AddGadgetItem(12, -1, "OpenGL spectrum")
; AddGadgetItem(12, -1, "Bump bass")
; SetGadgetState(12,0)
; DisableGadget(12,1)
;
; OptionGadget(13, 10, Top, 80, GadgetHeight, "640*480") : Top+20
; OptionGadget(14, 10, Top, 80, GadgetHeight, "800*600") : Top+20
; OptionGadget(15, 10, Top, 80, GadgetHeight, "1024*768")
; SetGadgetState(13, 1)
;
; ButtonGadget(16, 150, Top, 80, GadgetHeight, "Info")
CloseGadgetList()
GROUPE_ACTIF(0) = -1 : GROUPE_ACTIF(1) = -1
AjouteGadget(TextGadget (#PB_Any, 10, #WindowHeight-30, 250, 24, "PureBasic - Gadget demonstration"))
AjouteGadget(ButtonGadget(#PB_Any, #WindowWidth-100, #WindowHeight-36, 80, 24, "Quit"))
;SetGadgetState(3, 0)
;}
Repeat
EventID = WaitWindowEvent()
mx = WindowMouseX(#FEN_MAIN) : my = WindowMouseY(#FEN_MAIN) :
Select EventID
Case #WM_MOUSEMOVE
CurseurInfo(mx,my)
Debug ChercheGadget(mx,my)
EndSelect
Until EventID = #PB_Event_CloseWindow
EndIf
EndProcedure
Execute_FEN_MAIN()
End