[exemple] déplacement de gadget avec des poignées
Re: [exemple] déplacement de gadget avec des poignées
déterreur de post, bonjour...
y'a une autre méthode pour retrouver les gadgets sans passer par les api.
il faut stocker dans une table les coordonnées,dimensions,type des objets
structure objet_graphique
cx.l : cy.l : largeur.l : hauteur.l
type.l ; = #PB_GadgetType_*
endstructure
faire une routine d'insertion de gadget qui remplit la structure
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 rejetter les objet du type container, scrollarea, onglet
peut etre voir une routine qui écarte les objets trop loin du curseur (distance curseur /centre-objet)
distance pouvant être "adaptée" au besoin.
vala,
foyeuses jêtes à tousse
pét.. euh pat
y'a une autre méthode pour retrouver les gadgets sans passer par les api.
il faut stocker dans une table les coordonnées,dimensions,type des objets
structure objet_graphique
cx.l : cy.l : largeur.l : hauteur.l
type.l ; = #PB_GadgetType_*
endstructure
faire une routine d'insertion de gadget qui remplit la structure
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 rejetter les objet du type container, scrollarea, onglet
peut etre voir une routine qui écarte les objets trop loin du curseur (distance curseur /centre-objet)
distance pouvant être "adaptée" au besoin.
vala,
foyeuses jêtes à tousse
pét.. euh pat
Re: [exemple] déplacement de gadget avec des poignées
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...
à 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
- Kwai chang caine
- Messages : 6962
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: [exemple] déplacement de gadget avec des poignées
Salut PATRIC88
Content de te reparler
N'empeche que ton code y m'avait plus en ce temps, alors j'ai pris la pelle ....
Merci pour ton explication, pas mal l'idée des tableaux aussi
Bon j'suis allé faire une petite trempete dans la mer pour parler un peu americain et le gentil ARTIC FOX, y' m'a dépétré tout ça.
Il m'a donné encore mieux que sa premiere combine
Alors je l'ai mis dans un sac plastique...et j'ai retraversé la mer pour vous la ramener, on sait jamais ça peut servir
Bon c'est un peu le WAï car tout le monde y rajoute sa glute...mais ça marche, reste plus qu'a nettoyer les carreaux et mettre un coup de balai
Voila encore merci de ton code qui m'a drolement servi pour le depart....la route est encore longue, mais c'est un bon debut
Et ça m'a fait plaisir de te reparler
Content de te reparler
N'empeche que ton code y m'avait plus en ce temps, alors j'ai pris la pelle ....
Merci pour ton explication, pas mal l'idée des tableaux aussi
Bon j'suis allé faire une petite trempete dans la mer pour parler un peu americain et le gentil ARTIC FOX, y' m'a dépétré tout ça.
Il m'a donné encore mieux que sa premiere combine
Alors je l'ai mis dans un sac plastique...et j'ai retraversé la mer pour vous la ramener, on sait jamais ça peut servir
Bon c'est un peu le WAï car tout le monde y rajoute sa glute...mais ça marche, reste plus qu'a nettoyer les carreaux et mettre un coup de balai
Voila encore merci de ton code qui m'a drolement servi pour le depart....la route est encore longue, mais c'est un bon debut
Et ça m'a fait plaisir de te reparler
Code : Tout sélectionner
; Codé par Patrick88 modifié par ArticFox pour y inserer un ScrollArea
Enumeration
#FEN_MAIN
EndEnumeration
Enumeration 1
#GDT_PgnG
#GDT_PgnD
#GDT_PgnH
#GDT_PgnB
#GadgetArea ;<==== Add by KCC
#GDT_USER_GADGET
#GDT_DEMO1
#GDT_DEMO2
#GDT_DEMO3
#GDT_DEMO4
#GDT_LAST_USER_GADGET
EndEnumeration
#GDT_PoigneeTaille = 10
#GDT_PoigneeCouleur = $0000ff
#GDT_PoigneeCache = 1
#GDT_PoigneeMontre = 0
Global mx.w, my.w, deltax.w , deltay.w , gdt_x.w,gdt_y.w, gdt_id.l, gdt_pgn_id.l
Global Pas_Grille.b = 10
Global mpgn.POINT
Global Dim DemoRect.RECT(#PB_Compiler_EnumerationValue)
;...Load cursors
cursorNS = LoadCursor_(0, #IDC_SIZENS)
cursorWE = LoadCursor_(0, #IDC_SIZEWE)
cursorSIZE = LoadCursor_(0, #IDC_SIZEALL)
Procedure Poignee_cache(etat.b,gdt_id.l)
Protected x, y
HideGadget(#GDT_PgnG,etat)
HideGadget(#GDT_PgnD,etat)
HideGadget(#GDT_PgnH,etat)
HideGadget(#GDT_PgnB,etat)
If gdt_id > 0
ResizeGadget(#GDT_PgnG,GadgetX(gdt_id)-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)-#GDT_PoigneeTaille/2+GadgetHeight(gdt_id)/2 + y, #PB_Ignore, #PB_Ignore)
ResizeGadget(#GDT_PgnD,GadgetX(gdt_id)+GadgetWidth(gdt_id)-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)-#GDT_PoigneeTaille/2+GadgetHeight(gdt_id)/2 + y, #PB_Ignore, #PB_Ignore)
ResizeGadget(#GDT_PgnH,GadgetX(gdt_id)+GadgetWidth(gdt_id)/2-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)-#GDT_PoigneeTaille/2 + y, #PB_Ignore, #PB_Ignore)
ResizeGadget(#GDT_PgnB,GadgetX(gdt_id)+GadgetWidth(gdt_id)/2-#GDT_PoigneeTaille/2 + x,GadgetY(gdt_id)+GadgetHeight(gdt_id)-#GDT_PoigneeTaille/2 + y, #PB_Ignore, #PB_Ignore)
GetWindowRect_(GadgetID(#GDT_PgnG), @DemoRect(#GDT_PgnG))
GetWindowRect_(GadgetID(#GDT_PgnD), @DemoRect(#GDT_PgnD))
GetWindowRect_(GadgetID(#GDT_PgnH), @DemoRect(#GDT_PgnH))
GetWindowRect_(GadgetID(#GDT_PgnB), @DemoRect(#GDT_PgnB))
EndIf
EndProcedure
If OpenWindow(#FEN_MAIN, 0, 0, 500, 500, "Visual PB Zoub", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ScrollAreaGadget(#GadgetArea, 0, 0, WindowWidth(#FEN_MAIN), WindowHeight(#FEN_MAIN), 10000, 10000) ;<==== Add by KCC
OpenGadgetList(#GadgetArea) ;<==== Add by KCC
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)
TextGadget(#GDT_DEMO2,5,4,80,16,"Déplace moi")
StringGadget(#GDT_DEMO3,90,2,100,20,"Déplace moi")
CloseGadgetList()
ListIconGadget(#GDT_DEMO4,150,10,100,100,"Déplace moi",100)
GetWindowRect_(GadgetID(#GDT_DEMO2), @DemoRect(#GDT_DEMO2))
GetWindowRect_(GadgetID(#GDT_DEMO3), @DemoRect(#GDT_DEMO3))
GetWindowRect_(GadgetID(#GDT_DEMO4), @DemoRect(#GDT_DEMO4))
GetWindowRect_(GadgetID(#GDT_PgnG), @DemoRect(#GDT_PgnG))
GetWindowRect_(GadgetID(#GDT_PgnD), @DemoRect(#GDT_PgnD))
GetWindowRect_(GadgetID(#GDT_PgnH), @DemoRect(#GDT_PgnH))
GetWindowRect_(GadgetID(#GDT_PgnB), @DemoRect(#GDT_PgnB))
deltax = -2: deltay = -2
Repeat
event = WaitWindowEvent()
;
Select event
Case #WM_LBUTTONUP
gdt_id = 0
Poignee_cache(#GDT_PoigneeMontre,0)
deltax = -2: deltay = -2
Case #WM_MOUSEMOVE
mx = WindowMouseX(#FEN_MAIN) ; coordonnées curseur souris
my = WindowMouseY(#FEN_MAIN)
If GetAsyncKeyState_(#VK_LBUTTON)
If gdt_id > #GDT_USER_GADGET And gdt_id < #GDT_LAST_USER_GADGET And gdt_id = gdt_pgn_id
Poignee_cache(#GDT_PoigneeCache,gdt_id)
; sauvegarde la distance coin haut gauche gadget aux coordonnées curseur souris
If deltax < -1 And deltay < -1
deltax = mx-GadgetX(gdt_id)
deltay = my-GadgetY(gdt_id)
EndIf
gdt_x = mx-deltax
gdt_y = my-deltay
If Pas_Grille>0
gdt_x = (gdt_x / Pas_Grille)*Pas_Grille
gdt_y = (gdt_y / Pas_Grille)*Pas_Grille
EndIf
ResizeGadget(gdt_id, gdt_x, gdt_y, #PB_Ignore, #PB_Ignore)
Else
If Pas_Grille>0
mx = (mx / Pas_Grille)*Pas_Grille
my = (my / Pas_Grille)*Pas_Grille
EndIf
If gdt_pgn_id = #GDT_PgnG
ResizeGadget(#GDT_PgnG,mx,#PB_Ignore, #PB_Ignore, #PB_Ignore)
largeur_gadget.w = GadgetWidth(gdt_id)+(GadgetX(gdt_id)-mx)
ResizeGadget(gdt_id, mx, #PB_Ignore, largeur_gadget, #PB_Ignore)
Else
If gdt_pgn_id = #GDT_PgnD
ResizeGadget(#GDT_PgnD,mx-#GDT_PoigneeTaille,#PB_Ignore, #PB_Ignore, #PB_Ignore)
largeur_gadget.w = mx-GadgetX(gdt_id)
ResizeGadget(gdt_id, #PB_Ignore, #PB_Ignore, largeur_gadget, #PB_Ignore)
Else
If gdt_pgn_id = #GDT_PgnH
ResizeGadget(#GDT_PgnH,#PB_Ignore,my, #PB_Ignore, #PB_Ignore)
hauteur_gadget.w = GadgetHeight(gdt_id)+(GadgetY(gdt_id)-GadgetY(#GDT_PgnH))
ResizeGadget(gdt_id, #PB_Ignore, GadgetY(#GDT_PgnH), #PB_Ignore, hauteur_gadget)
Else
If gdt_pgn_id = #GDT_PgnB
ResizeGadget(#GDT_PgnB,#PB_Ignore,my-#GDT_PoigneeTaille, #PB_Ignore, #PB_Ignore)
hauteur_gadget.w = my-GadgetY(gdt_id)
ResizeGadget(gdt_id, #PB_Ignore, #PB_Ignore, #PB_Ignore, hauteur_gadget)
EndIf
EndIf
EndIf
EndIf
EndIf
If gdt_id > #GDT_USER_GADGET And gdt_id < #GDT_LAST_USER_GADGET
GetWindowRect_(GadgetID(#GDT_DEMO2), @DemoRect(#GDT_DEMO2))
GetWindowRect_(GadgetID(#GDT_DEMO3), @DemoRect(#GDT_DEMO3))
GetWindowRect_(GadgetID(#GDT_DEMO4), @DemoRect(#GDT_DEMO4))
EndIf
Else
GetCursorPos_(@mpgn)
gdt_pgn_id = -1
If PtInRect_(@DemoRect(#GDT_DEMO4), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO4 : EndIf
If PtInRect_(@DemoRect(#GDT_DEMO1), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO1 : EndIf
If PtInRect_(@DemoRect(#GDT_DEMO2), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO2 : EndIf
If PtInRect_(@DemoRect(#GDT_DEMO3), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_DEMO3 : EndIf
If PtInRect_(@DemoRect(#GDT_PgnG), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnG : EndIf
If PtInRect_(@DemoRect(#GDT_PgnD), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnD : EndIf
If PtInRect_(@DemoRect(#GDT_PgnH), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnH : EndIf
If PtInRect_(@DemoRect(#GDT_PgnB), mpgn\y << 32 + mpgn\x) : gdt_pgn_id = #GDT_PgnB : EndIf
Select gdt_pgn_id
Case #GDT_DEMO1 To #GDT_DEMO4
gdt_id = gdt_pgn_id
Poignee_cache(#GDT_PoigneeMontre,gdt_id)
SetCursor_(cursorSIZE)
Case #GDT_PgnG, #GDT_PgnD
SetCursor_(cursorWE)
Case #GDT_PgnH, #GDT_PgnB
SetCursor_(cursorNS)
Default
Poignee_cache(#GDT_PoigneeCache,0)
EndSelect
;Debug "gdt_id: "+Str(gdt_id)+" - gdt_pgn_id: "+Str(gdt_pgn_id)
EndIf
Case #PB_Event_Gadget
If EventGadget() > #GDT_USER_GADGET And EventGadget() < #GDT_LAST_USER_GADGET
gdt_id = EventGadget()
EndIf
EndSelect
Until event = #PB_Event_CloseWindow
EndIf
End
Re: [exemple] déplacement de gadget avec des poignées
Bonjour,
Il est évident que l'on peux se passer de systèmes complexe pour créer et forcément déplacer la position
des TextGadget(..)ou InputGadget(..) voir tout autre gadget...
Il suffit pour cela de disposer soit comme Pat via une structure...
OU comme dans l'exemple ci-dessous que je joins en Demo ou tout les TextGadget(..), InputGadget(..)
sont crée automatiquement à partir d'un tableau ou sont rangés les paramètres utiles à créer les gadgets
de l'exemple !
Forcément ce système et avec la simple détection de la position de la souris en concordance avec le TexteGadget ou autre et un ou deux "Click" pour mémoriser le Gadget concerné puis le Click suivant pour déterminer sa destination va déplacer le gadget ou il sera "déposé"...
De la même manière on peux extrapoler et dire que toute une fenêtre peut être composée de la sorte et rangé dans un tableau de paramètres, rangé sur disque. Puis lue par une application (comme ci-dessous) qui exploiterait les paramètres... Cela revient à créer un "VisualDesigner" qui ne produirait pas du code, mais des tableaux de paramètres qui à leurs tour sont lus et exploités par un lecteur de paramètres... cela donne ce qui est ci-dessous !
Voilà, voilà... s'aider des commentaires...
Pour jouer... Ligne 51... mettre le "Nombre=7 par exemple ou autre valeur <13 ici ...
nombre max de paramètres du tableau... Qui je le rappelle pourrait être lus sur disque, transmit etc...
PS: ¨Parfait le code amélioré que t'a ramené à la rame
Attention des détails à régler avec les poignée de redimensionnement
Et c'est presque tout de l'API...
Il est évident que l'on peux se passer de systèmes complexe pour créer et forcément déplacer la position
des TextGadget(..)ou InputGadget(..) voir tout autre gadget...
Il suffit pour cela de disposer soit comme Pat via une structure...
OU comme dans l'exemple ci-dessous que je joins en Demo ou tout les TextGadget(..), InputGadget(..)
sont crée automatiquement à partir d'un tableau ou sont rangés les paramètres utiles à créer les gadgets
de l'exemple !
Forcément ce système et avec la simple détection de la position de la souris en concordance avec le TexteGadget ou autre et un ou deux "Click" pour mémoriser le Gadget concerné puis le Click suivant pour déterminer sa destination va déplacer le gadget ou il sera "déposé"...
De la même manière on peux extrapoler et dire que toute une fenêtre peut être composée de la sorte et rangé dans un tableau de paramètres, rangé sur disque. Puis lue par une application (comme ci-dessous) qui exploiterait les paramètres... Cela revient à créer un "VisualDesigner" qui ne produirait pas du code, mais des tableaux de paramètres qui à leurs tour sont lus et exploités par un lecteur de paramètres... cela donne ce qui est ci-dessous !
Code : Tout sélectionner
;====================================================================
; - Saisie dans "Fentre Préparamétrée" - PureBasic Version 4.31 & 4.40
; 28-08-2009
; OU Fenetre à champs variable...
; GeBonet
;====================================================================
; Le BUT ici est de disposer d'un moyen d'appeler une fenêtre qui se dimensionne SEULE
; en fonction dunombre d'éléments demandé...
;
; Et évidement qui renvois les réponses correspondantes aux points envoyés.
;
; Pour lequel on donne : Un titre, une position d'affichage (x,y) la table de question, la tabe
; pour les réponses et le nombre de point à montrer et à remplir....
;
; SOIT comme ci-après => PointFenetre(NomEntete$ ,IniX ,IniY , Array Text.s(1), Array Rep.s(1), A_Remplir)
;
; On pourrait y ajouter des exigeances comme demander la couleur de fond, des caractères, la police
; ou encore le type à saisir (Alpha ou Numérique, voir réponse visible ou non (mots de passe)...
;
;====================================================================
; Mais l'intérêt PRINCIPAL ICI est de montrer l'aspect dynamique des affectation de Gadget !!!
; ---------==============================================================
; AUSSI avec l'utilisation exclusive d'instructions PureBasic...
;====================================================================
;
Enumeration
#Fenetre_Champ ; Constante de la fenêtre qui sera utilisé...
#DebutChamps ; Constante de Base pour le 1er Gadget d'affichage de la table des questions.
; CETTE CONSTANTE SERVIRA de BASE d'incrémentation pour fournir
; le n° unique des questions suivantes s'il y a lieu.
;
#Fichier=10 ; N° du premier Fichier
;
#AutrePoint=50 ; Constante de départ d'un AUTRE POINT de constante dynamique !!!
; ***************************************************************************************
;#bouton_valide ; Ne serons pas utilisé comme tels car comme les gadgets suivants seront affectés
;#bouton_annule ; dynamiquement ils risquent alors de prendre une valeur de constante existante et
; donc de ne pas être affiché... d'ou !!!
;
; LA REGLE : Lorsque l'on attribue des ID de gadget dynamiquement ils doivent
; commencer à un point connu (ici "#DebutChamps") puis rester sous contrôle du
; programme jusqu'a l'autre Constante identifié qui servirait de départ d'un autre point.
; Comme par exemple ICI : "#AutrePoint"
; -----------------------------------------------------------------------------------------------------------------
#bouton_valide =70 ; Ou alors une Affectation qui dans ce cas ci ne risque pas d'entrer en contact d'autres...
#bouton_annule=71 ; Idem ...
;
EndEnumeration
;
Define Nombre.i, IniX.i, IniY.i, Appel
Nombre=12 ; Nombre d'éléments MAXIMUM du tableau des données pouvant-être saisie...
Dim progParametreFichier.s(Nombre,3) ; Table Texte des Questions=0, Type de saisie=1, Longueur de la saisie=2...
Dim progReponse.s(Nombre) ; Table des Réponses correspondante
Dim progParametreAffichage.i(Nombre,3) ; Table d'affichage des données X,Y, CouleurFond,CouleurText
;
;------------------------------------------------------------------------------------------
Declare PointFenetre(NomEntete$, IniX , IniY , Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre)
Declare OuvreEtRange(Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre)
;
;------ Debut Programme ou d'endrit ou srea traité le Tableau Text(i) et les Recoir les réponses progReponse(i) >-----------------
;
; - ; ------------ Question ? ----------- < On pourrait aussi avec d'autres dimensions... > -----------
; Dim 1= Libélé Dim 2 = Type de donnée
progParametreFichier(0,0) = "Nom prenom" :progParametreFichier(0,1) = "0" ; Type de donnée saisie
progParametreFichier(1,0) = "Adresse +N°" :progParametreFichier(1,1) = "0" ; -----------------------------
progParametreFichier(2,0) = "Code Postal" :progParametreFichier(2,1) = "1" ; Type =0 => Alphanumérique
progParametreFichier(3,0) = "Localitée " :progParametreFichier(3,1) = "0" ; Type =1 => Numérique ENTIER Long
progParametreFichier(4,0) = "Pays" :progParametreFichier(4,1) = "0" ; Type =2 => Numérique Quad
progParametreFichier(5,0) = "Telephone" :progParametreFichier(5,1) = "0" ; Type =3 => Numérique Double/Flottant
progParametreFichier(6,0) = "Adresse Email" :progParametreFichier(6,1) = "0" ; Type =4 => PassWord
;
progParametreFichier(7,0) = "Entree Mensuel" :progParametreFichier(7,1) = "0" ; Type =4 => PassWord
progParametreFichier(8,0) = "Sortie Mensuel" :progParametreFichier(8,1) = "0" ; Type =4 => PassWord
progParametreFichier(9,0) = "Solde Mensuel" :progParametreFichier(9,1) = "0" ; Type =4 => PassWord
;
progParametreFichier(10,0) = "Entree Annuel":progParametreFichier(10,1) = "0" ; Type =4 => PassWord
progParametreFichier(11,0) = "Sortie Annuel":progParametreFichier(11,1) = "0" ; Type =4 => PassWord
progParametreFichier(12,0) = "Solde Annuel" :progParametreFichier(12,1) = "0" ; Type =4 => PassWord
; Dim 3= Longueur du champ de saisie voir rangement Dim 4 =
progParametreFichier(0,2)="30":progParametreFichier(1,2)="35":progParametreFichier(2,2)="8":progParametreFichier(3,2)="30"
progParametreFichier(4,2)="30":progParametreFichier(5,2)="16":progParametreFichier(6,2)="40"
progParametreFichier(7,2)="8":progParametreFichier(8,2)="8":progParametreFichier(9,2)="8"
progParametreFichier(10,2)="8":progParametreFichier(11,2)="8":progParametreFichier(12,2)="8"
;
; ---------------------------------------------------------------------------------------------------------------
For i=0 To Nombre:progReponse(i) = "":Next i ; Mise à zéro de la table des réponses..
; ---------------------------------------------------------------------------------------------------------------
;
NomEntete$="Identification" ; Titre de la fenetre
IniX=400:IniY=200 ; Position sur l'écran
Appel=12 ; Nombre d'élément du tableau à utiliser...
If Appel>Nombre:Appel=Nombre:EndIf ; Je m'auto-contrôle ne peut-être plus grand que le nombre d'éléments du tableau :-))
; ---------------------------------------------------------------------------------------------------------------
Resultat=PointFenetre(NomEntete$, IniX ,IniY, progParametreFichier.s() , progReponse() , Appel) ; Appel de la procèdure....
;
Debug "Retour Procedure : "+Str(Resultat)
; ---------------------------------------------------------------------------------------------------------------
Espace$=""
For i=0 To Nombre
progLongueur=Val(progParametreFichier(i,2))
Espace$+Left(progParametreFichier(i,0)+Space(progLongueur),progLongueur)
Debug progParametreFichier(i,0)+" : "+progParametreFichier(i,1)+" : "+progParametreFichier(i,2)+" =>"+progReponse(i)
Next i ; Affichage des données saises en fonction de "Appel"
Debug Espace$
;
; A partir d'ici ou ceci progReponse(n) peut être utilisée pour être classé dans liste chainée
; ou un Tableau deux dimensions type Table_Adresse(i,n) les progReponse(n) sont les lignes
; de Table_Adresse(i,n)...
;
End
;
; *************************************************************************************************************
Procedure OuvreEt_Range(Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre)
;
; CreateFile(#Fichier, NomFichier$) ATTENTION création si existe.. Perdu !!!
; OpenFile(#Fichier, NomFichier$)
;
EndProcedure
; *************************************************************************************************************
Procedure OuvreEt_Lecture(Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre)
;
; OpenFile(#Fichier, NomFichier$)
;
EndProcedure
; **********************************************************************************************
; >>>>>>>>>> Fenêtre Commune de question <<<<<<<<<<
; **********************************************************************************************
Procedure PointFenetre(Titre$, IniX , IniY , Array progParametreFichier.s(2) , Array progReponse.s(1) ,Nombre)
Taille=ArraySize(progParametreFichier())
For i=0 To Nombre ; Determination du champs le plus long
If Lmax<Len(progParametreFichier(i,0)):Lmax=Len(progParametreFichier(i,0)):EndIf
If Lmax2<Val(progParametreFichier(i,2)):Lmax2=Val(progParametreFichier(i,2)):EndIf
Next i
;----------------------------- Calcul des dimensions -------------------------------------
HauteurBouton = 20
Largeur_fenetre = (160+Lmax+Lmax2)*2+20 ; Largeur de la fenêtre tenant compte des longueur des champs
Hauteur_Fenetre= Nombre*30+HauteurBouton+50 ; Hauteur de la fenêtre (50 = 30 titre + 20 interligne avant boutons ! )
PosYBouton =Hauteur_Fenetre-30 ; Position Y des boutons
;
; ---------------------------------------------------------------------------------------------------
;
WindWid=Largeur_fenetre : WindHigh=Hauteur_Fenetre : Cas=0
#WinOption = #PB_Window_SystemMenu;| #PB_Window_SizeGadget;|#PB_Window_MaximizeGadget
; Fenetre d'interrogation multibox ...
If OpenWindow(#Fenetre_Champ,IniX,IniY,WindWid,WindHigh,Titre$,#WinOption);#PB_Window_BorderLess
SetWindowColor(#Fenetre_Champ,$0AFAF5) ; Colorier la fenêtre
StickyWindow(#Fenetre_Champ, 1):Lentitre=Len(Titre$)
;
Milieu=WindWid/2-Lentitre/2 ; Milieu de la Largeur_fenetre
PosYDep=35 ; Position départ
PosY=PosYDep ; Position Y
; ------------------------------------- Titres ------------------------------------------------
TextGadget(#DebutChamps,Milieu-(Lentitre)*6, 5, Milieu+50,25,Titre$) ;
SetGadgetFont(#DebutChamps+j,LoadFont(#DebutChamps+j, "Arial", 18))
SetGadgetColor(#DebutChamps+j,#PB_Gadget_BackColor, $0AFAF5)
SetGadgetColor(#DebutChamps+j,#PB_Gadget_FrontColor, $E25048)
; --------------------------------- Question et champs pour réponses --------------
For j=1 To Nombre
Texte$=Trim(progParametreFichier(j-1,0)): LenChamp=Val(progParametreFichier(j-1,2))*6
TextGadget(#DebutChamps+j,10, PosY, Milieu-15,20,Texte$) ; Attention ici les ID sont attribué dynamiquement !
StringGadget(#AutrePoint+j, Milieu-20, PosY,LenChamp,20,"") ; Milieu-10 Attention ici les ID sont attribué dynamiquement !
;
SetGadgetFont(#DebutChamps+j,LoadFont(#DebutChamps+j, "Arial", 12))
SetGadgetColor(#DebutChamps+j,#PB_Gadget_BackColor, $0AFAF5)
SetGadgetColor(#DebutChamps+j,#PB_Gadget_FrontColor, $E25048)
PosY+30
Next j :; SendMessage_(GadgetID(#MyListIcon), #LVM_SETEXTENDEDLISTVIEWSTYLE, #LVS_EX_GRIDLINES, #LVS_EX_GRIDLINES)
; -----------------------------------------------------------------------------------------------
BoutonVal=#AutrePoint+j ; ICI j'affecte au "Bouton" une ID Dynamique pour l'exemple
;
ButtonGadget(BoutonVal,10,PosYBouton,100,20,"Valider",#PB_Button_Toggle)
ButtonGadget(#bouton_annule,Largeur_fenetre-120,PosYBouton,100,20,"Annuler",#PB_Button_Toggle)
; Et ICI c'est "#bouton_annule"
; -----------------------------------------------------------------------------------------------
EndIf
; ********************************************************************************************
Repeat
Select WaitWindowEvent (#Fenetre_Champ) ; Traite les boutons....
Case #PB_Event_Gadget
Select EventGadget () ; Selectionne en fonction de ....???
; -----------------------------------------------------------------------------------
Case BoutonVal ; VALIDE pour MODIF ou AJOUT
;
For j=1 To Nombre ; Récupère les données dans le tableau
progReponse(j-1)=GetGadgetText (#AutrePoint+j)
Next j
Fermer_window1=1 :Cas=1
; --------------------------------------------------------------------------------
Case #bouton_annule ;BoutonAnul ; Annule l'entrée
Fermer_window1=1 :Cas=9
; --------------------------------------------------------------------------------
EndSelect
Case #PB_Event_CloseWindow
Fermer_window1=1 :Cas=9
EndSelect
Until Fermer_window1=1
StickyWindow(#Fenetre_Champ,0) ;
CloseWindow (#Fenetre_Champ) ; Fermeture de la fenêtre ajoute...
; ---------------------------------
ProcedureReturn Cas
;
EndProcedure
Pour jouer... Ligne 51... mettre le "Nombre=7 par exemple ou autre valeur <13 ici ...
nombre max de paramètres du tableau... Qui je le rappelle pourrait être lus sur disque, transmit etc...
PS: ¨Parfait le code amélioré que t'a ramené à la rame
Attention des détails à régler avec les poignée de redimensionnement
Et c'est presque tout de l'API...
Windows 7 et Windows 8.1 Pb 5.0 jusque 5.24 Lts 64 et 5.3 (64)/b]
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
“Ceux qui rêvent éveillés ont conscience de mille choses qui échappent à ceux qui ne rêvent qu’endormis.”
-Edgar Allan Poe-
- Kwai chang caine
- Messages : 6962
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: [exemple] déplacement de gadget avec des poignées
Merci GEBO de ta demo
Mon "pseudo logigramme" simplounet, avance apres 12 heures d'acharnement dont 6 perdues pour rien
J'ai regardé aujourd'hui, mais y'a pas foule dans les giciels pour logigrammes en freewares, moi j'avais trouvé DIA, mais c'est une galere a mettre en place
A croire que tout ceux qui ont besoin de ce genre de giciels, ils ont des sous
Pour relier les gadgets, j'ai triché j'ai mis des images en forme de fleches
Je voulais tracer des ligner directement sur la fenetre reliant les gadgets, je crois que j'avais vu ça auparavant sur un code, je verrais si je trouve, ce serait une possibilité qui serais cool
Autrement je resterais avec mes fleches images
Encore merci
Mon "pseudo logigramme" simplounet, avance apres 12 heures d'acharnement dont 6 perdues pour rien
J'ai regardé aujourd'hui, mais y'a pas foule dans les giciels pour logigrammes en freewares, moi j'avais trouvé DIA, mais c'est une galere a mettre en place
A croire que tout ceux qui ont besoin de ce genre de giciels, ils ont des sous
Pour relier les gadgets, j'ai triché j'ai mis des images en forme de fleches
Je voulais tracer des ligner directement sur la fenetre reliant les gadgets, je crois que j'avais vu ça auparavant sur un code, je verrais si je trouve, ce serait une possibilité qui serais cool
Autrement je resterais avec mes fleches images
Encore merci
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Re: [exemple] déplacement de gadget avec des poignées
Montre où tu en esKwai chang caine a écrit :Merci GEBO de ta demo
Mon "pseudo logigramme" simplounet, avance apres 12 heures d'acharnement dont 6 perdues pour rien
J'ai regardé aujourd'hui, mais y'a pas foule dans les giciels pour logigrammes en freewares, moi j'avais trouvé DIA, mais c'est une galere a mettre en place
A croire que tout ceux qui ont besoin de ce genre de giciels, ils ont des sous
Pour relier les gadgets, j'ai triché j'ai mis des images en forme de fleches
Je voulais tracer des ligner directement sur la fenetre reliant les gadgets, je crois que j'avais vu ça auparavant sur un code, je verrais si je trouve, ce serait une possibilité qui serais cool
Autrement je resterais avec mes fleches images
Encore merci
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
Re: [exemple] déplacement de gadget avec des poignées
pour tracer des flèches, pourquoi ne pas utiliser GDI+ ?
- Kwai chang caine
- Messages : 6962
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: [exemple] déplacement de gadget avec des poignées
Merci les copains de vos reponses
@PROGI1984
Bah en fait, j'en suis la
http://www.purebasic.fr/french/viewtopi ... 38#p107438
Je viens aussi d'avoir une idée pour faire mes fleches qui tournent
Si je les met dans l'angle d'un gadget je pourrais profiter de l'angle droit
@POSHU
Bah, j'ai honte mais DENIS m'a fait la meme proposition.
Il m'a donné noir de conseil, mais c'est une usine a gaz ce truc, et je me sent pas a la hauteur
J'voudrais juste une fleche simple "Extensible", je sais c'est pas si simple, mais j'esperais ne pas faire appel a des monstres de technologie
@PROGI1984
Bah en fait, j'en suis la
http://www.purebasic.fr/french/viewtopi ... 38#p107438
Je viens aussi d'avoir une idée pour faire mes fleches qui tournent
Si je les met dans l'angle d'un gadget je pourrais profiter de l'angle droit
@POSHU
Bah, j'ai honte mais DENIS m'a fait la meme proposition.
Il m'a donné noir de conseil, mais c'est une usine a gaz ce truc, et je me sent pas a la hauteur
J'voudrais juste une fleche simple "Extensible", je sais c'est pas si simple, mais j'esperais ne pas faire appel a des monstres de technologie