[Résolu] Poignées de redimentionnement
[Résolu] Poignées de redimentionnement
Je souhaiterais faire un logiciel où on pourrait changer la taille des gadgets en cliquant sur des poignées comme par exemple dans PureForm de Gnozal, est-ce que quelqu'un pourrait me donner un petit coup de pouce pour pouvoir me lancer, je l'en remercierais grandement !
Dernière modification par Micoute le ven. 23/nov./2012 9:32, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Un homme doit être poli, mais il doit aussi être libre !
Re: Poignées de redimentionnement
http://www.purebasic.fr/french/viewtopi ... 9e#p107245
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; EPB
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Poignées de redimentionnement
Un autre exemple
Code : Tout sélectionner
EnableExplicit
Enumeration
#MainForm ;Fenetre en cours de création
;Points d'ancrage d'un gadget selectionné
#AnchorN ;Nord
#AnchorE ;Est
#AnchorS ;Sud
#AnchorW ; Ouest
#AnchorSize ;Taille de chaque point d'ancrage
EndEnumeration
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;Un gadget est il survolé ?
Macro GadgetHoverCheck(x, y, Gadget)
(((Not x<GadgetX(Gadget)) & (Not y<GadgetY(Gadget))) &(Not x>=(GadgetX(Gadget)+GadgetWidth(Gadget))) & (Not y>=(GadgetY(Gadget)+GadgetHeight(gadget))))
EndMacro
;Structure d'un gadget
Structure StructureGadget
Idgadget.i ;Identifiant gadget lors de la création
EndStructure
Global Dim Gadgets.StructureGadget(1), IdGadget.i, CountGadgets.i
;Coordonnées X,Y de création d'un gadget
Global X.i, Y.i, X1.i, Y1.i, Width.i, Height.i, Width1.i, Height1.i, DeltaX.i, DeltaY.i
;Les Poignées : Couleur, Taille, Cachées (Oui/Non), actif (Aucune=0, N=1, E=2, S=3, W=4)
Global AnchorColor.i=$0000ff, AnchorSize.i=7, AnchorHide=#True, AnchorActif.i
;Cureurs
Global cursorNS.i, cursorWE.i, cursorSIZE.i
;Gadget sélectionné, gadget en cours de déplacement ou de redimentionnement
Global GadgetCheck.b, GadgetDraw.b
Procedure EventMouse()
;Evenement Souris (0: Rien, 1 :Clique Gauche, 2 : Clique central, 3 : Clique droitProcedure EventMouse()
ProcedureReturn Abs(GetAsyncKeyState_(#VK_LBUTTON) + GetAsyncKeyState_(#VK_RBUTTON)*3 + GetAsyncKeyState_(#VK_MBUTTON)*2)/$8000
EndProcedure
;Création des points d'ancrage
Procedure AnchorCreate()
TextGadget(#AnchorN, 0, 0, AnchorSize, AnchorSize,"")
TextGadget(#AnchorE, 0, 0, AnchorSize, AnchorSize,"")
TextGadget(#AnchorS, 0, 0, AnchorSize, AnchorSize,"")
TextGadget(#AnchorW, 0, 0, AnchorSize, AnchorSize,"")
SetGadgetColor(#AnchorN, #PB_Gadget_BackColor, AnchorColor)
SetGadgetColor(#AnchorE, #PB_Gadget_BackColor, AnchorColor)
SetGadgetColor(#AnchorS, #PB_Gadget_BackColor, AnchorColor)
SetGadgetColor(#AnchorW, #PB_Gadget_BackColor, AnchorColor)
EndProcedure
;Cache les points d'ancrage
Procedure AnchorHide(Value.b)
HideGadget(#AnchorN, Value)
HideGadget(#AnchorE, Value)
HideGadget(#AnchorS, Value)
HideGadget(#AnchorW, Value)
AnchorHide=Value
EndProcedure
;Positionne les point d'ancrage
Procedure AnchorMove(IdGadget)
Protected Left.i, Top.i, Width.i, Height.i
Left=GadgetX(IdGadget)
Top=GadgetY(IdGadget)
Width=GadgetWidth(IdGadget)
Height=GadgetHeight(IdGadget)
If AnchorHide=#True
AnchorHide(#False)
EndIf
ResizeGadget(#AnchorN, (Left+Width/2), Top-AnchorSize, AnchorSize, AnchorSize)
ResizeGadget(#AnchorS, Left+Width/2, Top+Height+AnchorSize/4, AnchorSize,AnchorSize)
ResizeGadget(#AnchorE, Left+AnchorSize/2+Width, Top+(Height-AnchorSize)/2, AnchorSize, AnchorSize)
ResizeGadget(#AnchorW, Left-AnchorSize, Top+(Height-AnchorSize)/2, AnchorSize, AnchorSize)
EndProcedure
;Quel est le point d'ancrage actif
Procedure GetAnchorCheck()
If GadgetDraw=#False
AnchorActif=#False
If GadgetHoverCheck(x,y,#AnchorN)
AnchorActif=1
EndIf
If GadgetHoverCheck(x,y,#AnchorS)
AnchorActif=2
EndIf
If GadgetHoverCheck(x,y,#AnchorE)
AnchorActif=3
EndIf
If GadgetHoverCheck(x,y,#AnchorW)
AnchorActif=4
EndIf
ProcedureReturn AnchorActif
EndIf
EndProcedure
;Repositionne le gadget
Procedure GadgetDraw(KbdValue.i, Idgadget.i)
;Un gadget est il toujours selectionné ?
If IdGadget<>0
Width=GadgetWidth(Idgadget)
Height=GadgetHeight(IdGadget)
If AnchorActif>0
DeltaX=0 : DeltaY=0
Select AnchorActif
Case 1 ;Nord
SetCursor_(cursorNS)
X=GadgetX(IdGadget)
Height=Height+(GadgetY(IdGadget)-Y)
Case 2 ;Sud
SetCursor_(cursorNS)
X=GadgetX(IdGadget)
Height=Y-GadgetY(IdGadget)
Y=GadgetY(IdGadget)
Case 3 ;Est
SetCursor_(cursorWE)
Y=GadgetY(IdGadget)
Width=X-GadgetX(IdGadget)
X=GadgetX(IdGadget)
Case 4 ;Ouest
SetCursor_(cursorWE)
Y=GadgetY(IdGadget)
Width=Width+(GadgetX(IdGadget)-X)
EndSelect
Else
SetCursor_(cursorSIZE)
EndIf
;Quelques chose est il modifié dans les dimensions ?
If (X1<>X) Or (Y1<>Y) Or (Width1<>Width) Or (Height1<>Height) ;And AnchorActif=0
ResizeGadget(Idgadget, X-DeltaX, Y-DeltaY, Width, Height)
AnchorMove(Idgadget)
EndIf
X1=X : Y1=Y : Width1=Width : Height1=Height
EndIf
EndProcedure
;Un gadget est il selectionné
Procedure GetGadgetCheck()
Protected i.i
If GadgetDraw=#False
GadgetCheck=#False
For i=0 To CountGadgets-1
If GadgetHoverCheck(X, Y, Gadgets(i)\Idgadget)
IdGadget=Gadgets(i)\Idgadget
;Delta entre la position de la souris et les bords haut/gauche du gadget
DeltaX=X-GadgetX(IdGadget)
DeltaY=Y-GadgetY(Idgadget)
GadgetCheck=#True
AnchorHide(#False)
Else
AnchorHide(#True)
EndIf
Next
EndIf
ProcedureReturn GadgetCheck
EndProcedure
;Fenetre en cours de création
Procedure MainFormShow()
OpenWindow(#MainForm,320,100,500,400,"Nouvelle Fenetre",#PB_Window_SizeGadget | #PB_Window_SystemMenu)
CountGadgets = 5
ReDim Gadgets(CountGadgets)
Gadgets(0)\IdGadget = TextGadget(#PB_Any, 10, 10, 80, 20, "Nom")
Gadgets(1)\IdGadget = StringGadget(#PB_Any, 100, 10, 200, 22, "")
Gadgets(2)\IdGadget = ButtonGadget(#PB_Any, 310, 10, 80, 22, "Ajouter")
Gadgets(3)\IdGadget = TextGadget(#PB_Any, 10, 35, 80, 20, "Adresse")
Gadgets(4)\IdGadget = EditorGadget(#PB_Any, 100, 35, 200, 50)
;Initialisation des points d'ancrage
AnchorCreate()
AnchorHide(#True)
;Initialisation des curseurs
cursorNS = LoadCursor_(0, #IDC_SIZENS)
cursorWE = LoadCursor_(0, #IDC_SIZEWE)
cursorSIZE = LoadCursor_(0, #IDC_SIZEALL)
EndProcedure
;-Affichage de la fenetre
MainFormShow()
;-Boucle evenementielle
Repeat
Event=WaitWindowEvent()
If GetActiveWindow()=#MainForm
Select EventMouse()
Case 0 ;Bouton gauche/droit de la souris relaché
If GadgetDraw=#True
GadgetDraw=#False ;Le gadget n'est plus en cours de déplacement
AnchorActif=#False ;Les point d'ancrages ne sont plus actifs (Mais restent visibles)
EndIf
Case 1 ;Clic bouton gauche de la souris
;Quels sont les coordonnées de la souris ?
X=WindowMouseX(#MainForm)
Y=WindowMouseY(#Mainform)
;Un gadget ou un point d'ancrage est il selectionné ?
If GetAnchorCheck()>0 Or GetGadgetCheck() Or AnchorActif>0
GadgetDraw=#True ; Le gadget selectionné est susceptible d'etre déplacer
GadGetDraw(0, IdGadget)
EndIf
Case 2 ;Clic bouton central de la souris
Case 3 ;Clic bouton droit de la souris
EndSelect
EndIf
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Poignées de redimentionnement
Je vous remercie tous pour votre contribution, bien que l'exemple fourni par Dobro soit très bon, mais il plante si on modifie la taille du gadget et je sais que ce n'est pas sa création, mais ma préférence va à falsam.
Et encore grand merci à tous les deux !
Et encore grand merci à tous les deux !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Un homme doit être poli, mais il doit aussi être libre !