Code : Tout sélectionner
;- Module: TransformationGadget
DeclareModule TransformationGadget
EnumerationBinary 1
#TransformationGadget_Position
#TransformationGadget_Horizontalement
#TransformationGadget_Verticalement
EndEnumeration
#TransformationGadget_Taille = #TransformationGadget_Horizontalement|#TransformationGadget_Verticalement
#TransformationGadget_Totale = #TransformationGadget_Position|#TransformationGadget_Horizontalement|#TransformationGadget_Verticalement
Declare DesactiverTransformationGadget(Gadget)
Declare ActiverTransformationGadget(Gadget, Drapeaux = #TransformationGadget_Totale, Grille = 1)
EndDeclareModule
Module TransformationGadget
EnableExplicit
#TaillePoignees = 5
Structure TransformationGadget
Gadget.i
Poignee.i[10]
Grille.i
EndStructure
Structure DonneesTampon
Poignee.i[10]
EndStructure
Global NewList TransformationGadget.TransformationGadget()
Procedure CorrespondanceGrille(Valeur, Grille, Max = $7FFFFFFF)
Valeur = Round(Valeur / Grille, #PB_Round_Nearest) * Grille
If Valeur > Max
ProcedureReturn Max
Else
ProcedureReturn Valeur
EndIf
EndProcedure
Procedure TransformationGadget_Callback()
Static Selected, X, Y, OffsetX, OffsetY, GadgetX0, GadgetX1, GadgetY0, GadgetY1
Protected *TransformationGadget.TransformationGadget = GetGadgetData(EventGadget())
With *TransformationGadget
Select EventType()
Case #PB_EventType_LeftButtonDown
Selected = #True
OffsetX = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseX)
OffsetY = GetGadgetAttribute(EventGadget(), #PB_Canvas_MouseY)
GadgetX0 = GadgetX(\Gadget)
GadgetX1 = GadgetX0 + GadgetWidth(\Gadget)
GadgetY0 = GadgetY(\Gadget)
GadgetY1 = GadgetY0 + GadgetHeight(\Gadget)
Case #PB_EventType_LeftButtonUp
Selected = #False
Case #PB_EventType_MouseMove
If Selected
X = WindowMouseX(GetActiveWindow())-OffsetX
Y = WindowMouseY(GetActiveWindow())-OffsetY
Select EventGadget()
Case \Poignee[1]
ResizeGadget(\Gadget, CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1), #PB_Ignore,
GadgetX1 - CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1), CorrespondanceGrille(Y, \Grille) - GadgetY0)
Case \Poignee[2]
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, CorrespondanceGrille(Y, \Grille) - GadgetY0)
Case \Poignee[3]
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, CorrespondanceGrille(X, \Grille) - GadgetX0, CorrespondanceGrille(Y, \Grille) - GadgetY0)
Case \Poignee[4]
ResizeGadget(\Gadget, CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1), #PB_Ignore,
GadgetX1 - CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1), #PB_Ignore)
Case \Poignee[5]
ResizeGadget(\Gadget, CorrespondanceGrille(X - #TaillePoignees, \Grille), CorrespondanceGrille(Y + #TaillePoignees, \Grille), #PB_Ignore, #PB_Ignore)
Case \Poignee[6]
ResizeGadget(\Gadget, #PB_Ignore, #PB_Ignore, CorrespondanceGrille(X, \Grille) - GadgetX0, #PB_Ignore)
Case \Poignee[7]
ResizeGadget(\Gadget, CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1),
CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1),
GadgetX1 - CorrespondanceGrille(X + #TaillePoignees, \Grille, GadgetX1),
GadgetY1 - CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1))
Case \Poignee[8]
ResizeGadget(\Gadget, #PB_Ignore, CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1), #PB_Ignore,
GadgetY1 - CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1))
Case \Poignee[9]
ResizeGadget(\Gadget, #PB_Ignore, CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1),
CorrespondanceGrille(X, \Grille) - GadgetX0, GadgetY1 - CorrespondanceGrille(Y + #TaillePoignees, \Grille, GadgetY1))
EndSelect
If \Poignee[1]
ResizeGadget(\Poignee[1], GadgetX(\Gadget) - #TaillePoignees, GadgetY(\Gadget) + GadgetHeight(\Gadget), #PB_Ignore, #PB_Ignore)
EndIf
If \Poignee[2]
ResizeGadget(\Poignee[2], GadgetX(\Gadget) + (GadgetWidth(\Gadget) - #TaillePoignees) / 2, GadgetY(\Gadget) + GadgetHeight(\Gadget), #PB_Ignore, #PB_Ignore)
EndIf
If \Poignee[3]
ResizeGadget(\Poignee[3], GadgetX(\Gadget) + GadgetWidth(\Gadget), GadgetY(\Gadget) + GadgetHeight(\Gadget), #PB_Ignore, #PB_Ignore)
EndIf
If \Poignee[4]
ResizeGadget(\Poignee[4], GadgetX(\Gadget) - #TaillePoignees, GadgetY(\Gadget) + (GadgetHeight(\Gadget) - #TaillePoignees) / 2, #PB_Ignore, #PB_Ignore)
EndIf
If \Poignee[5]
ResizeGadget(\Poignee[5], GadgetX(\Gadget) + #TaillePoignees, GadgetY(\Gadget) - #TaillePoignees, #PB_Ignore, #PB_Ignore)
EndIf
If \Poignee[6]
ResizeGadget(\Poignee[6], GadgetX(\Gadget) + GadgetWidth(\Gadget), GadgetY(\Gadget) + (GadgetHeight(\Gadget) - #TaillePoignees) / 2, #PB_Ignore, #PB_Ignore)
EndIf
If \Poignee[7]
ResizeGadget(\Poignee[7], GadgetX(\Gadget) - #TaillePoignees, GadgetY(\Gadget) - #TaillePoignees, #PB_Ignore, #PB_Ignore)
EndIf
If \Poignee[8]
ResizeGadget(\Poignee[8], GadgetX(\Gadget) + (GadgetWidth(\Gadget)-#TaillePoignees) / 2, GadgetY(\Gadget) - #TaillePoignees, #PB_Ignore, #PB_Ignore)
EndIf
If \Poignee[9]
ResizeGadget(\Poignee[9], GadgetX(\Gadget) + GadgetWidth(\Gadget), GadgetY(\Gadget) - #TaillePoignees, #PB_Ignore, #PB_Ignore)
EndIf
EndIf
EndSelect
EndWith
EndProcedure
Procedure DesactiverTransformationGadget(Gadget)
Protected I, *TransformationGadget.TransformationGadget
ForEach TransformationGadget()
If TransformationGadget()\Gadget = Gadget
For I = 1 To 9
If TransformationGadget()\Poignee[I]
FreeGadget(TransformationGadget()\Poignee[I])
EndIf
Next
DeleteElement(TransformationGadget())
EndIf
Next
EndProcedure
Procedure ActiverTransformationGadget(Gadget, Drapeaux = #TransformationGadget_Totale, Grille = 1)
Protected Poignee, I
Protected *TransformationGadget.TransformationGadget
Protected *Curseurs.DonneesTampon = ?Curseurs
Protected *Drapeaux.DonneesTampon = ?Drapeaux
ForEach TransformationGadget()
If TransformationGadget()\Gadget = Gadget
For I = 1 To 9
If TransformationGadget()\Poignee[I]
FreeGadget(TransformationGadget()\Poignee[I])
EndIf
Next
DeleteElement(TransformationGadget())
EndIf
Next
*TransformationGadget = AddElement(TransformationGadget())
*TransformationGadget\Gadget = Gadget
*TransformationGadget\Grille = Grille
For I = 1 To 9
If Drapeaux & *Drapeaux\Poignee[I] = *Drapeaux\Poignee[I]
Select I
Case 1
Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) - #TaillePoignees, GadgetY(Gadget) + GadgetHeight(Gadget), #TaillePoignees, #TaillePoignees)
Case 2
Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + (GadgetWidth(Gadget)-#TaillePoignees) / 2, GadgetY(Gadget) + GadgetHeight(Gadget), #TaillePoignees, #TaillePoignees)
Case 3
Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + GadgetWidth(Gadget), GadgetY(Gadget) + GadgetHeight(Gadget), #TaillePoignees, #TaillePoignees)
Case 4
Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) - #TaillePoignees, GadgetY(Gadget) + (GadgetHeight(Gadget)-#TaillePoignees) / 2, #TaillePoignees, #TaillePoignees)
Case 5
Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + #TaillePoignees, GadgetY(Gadget) - #TaillePoignees, 2 * #TaillePoignees, #TaillePoignees)
Case 6
Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + GadgetWidth(Gadget), GadgetY(Gadget) + (GadgetHeight(Gadget)-#TaillePoignees) / 2, #TaillePoignees, #TaillePoignees)
Case 7
Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) - #TaillePoignees, GadgetY(Gadget) - #TaillePoignees, #TaillePoignees, #TaillePoignees)
Case 8
Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + (GadgetWidth(Gadget)-#TaillePoignees) / 2, GadgetY(Gadget) - #TaillePoignees, #TaillePoignees, #TaillePoignees)
Case 9
Poignee = CanvasGadget(#PB_Any, GadgetX(Gadget) + GadgetWidth(Gadget), GadgetY(Gadget) - #TaillePoignees, #TaillePoignees, #TaillePoignees)
EndSelect
*TransformationGadget\Poignee[I] = Poignee
SetGadgetData(Poignee, *TransformationGadget)
SetGadgetAttribute(Poignee, #PB_Canvas_Cursor, *Curseurs\Poignee[I])
If StartDrawing(CanvasOutput(Poignee))
Box(0, 0, OutputWidth(), OutputHeight(), $000000)
Box(1, 1, OutputWidth() - 2, OutputHeight() - 2, $FFFFFF)
StopDrawing()
EndIf
BindGadgetEvent(Poignee, @TransformationGadget_Callback())
EndIf
Next
DataSection
Curseurs:
Data.i 0, #PB_Cursor_LeftDownRightUp, #PB_Cursor_UpDown, #PB_Cursor_LeftUpRightDown, #PB_Cursor_LeftRight
Data.i #PB_Cursor_Arrows, #PB_Cursor_LeftRight, #PB_Cursor_LeftUpRightDown, #PB_Cursor_UpDown, #PB_Cursor_LeftDownRightUp
Drapeaux:
Data.i 0, #TransformationGadget_Taille, #TransformationGadget_Verticalement, #TransformationGadget_Taille, #TransformationGadget_Horizontalement
Data.i #TransformationGadget_Position, #TransformationGadget_Horizontalement, #TransformationGadget_Taille, #TransformationGadget_Verticalement, #TransformationGadget_Taille
EndDataSection
EndProcedure
EndModule
;- Code exemple
CompilerIf #PB_Compiler_IsMainFile
UseModule TransformationGadget
Enumeration
#Fenetre_principale
#TransformationGadget
#Edt
#Btn
#TrB
#Spn
EndEnumeration
OpenWindow(#Fenetre_principale, 0, 0, 600, 400, "Ma fenêtre", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
EditorGadget(#Edt, 50, 100, 200, 50, #PB_Editor_WordWrap)
SetGadgetText(#Edt, "Les assistants grincheux font un mélange toxique pour le mal de la Reine et du valet.")
ButtonGadget(#Btn, 50, 250, 200, 25, "Salut monde cruel!", #PB_Button_MultiLine)
TrackBarGadget(#TrB, 350, 100, 200, 25, 0, 100) : SetGadgetState(#TrB, 70)
SpinGadget(#Spn, 350, 250, 200, 25, 0, 100, #PB_Spin_Numeric) : SetGadgetState(#Spn, 70)
ButtonGadget(#TransformationGadget, 20, 20, 150, 25, "Activer la transformation", #PB_Button_Toggle)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadget()
Case #TransformationGadget
Select GetGadgetState(#TransformationGadget)
Case #False
SetGadgetText(#TransformationGadget, "Activer Transformation")
DesactiverTransformationGadget(#Edt)
DesactiverTransformationGadget(#Btn)
DesactiverTransformationGadget(#TrB)
DesactiverTransformationGadget(#Spn)
Case #True
SetGadgetText(#TransformationGadget, "Desactiver Transformation")
ActiverTransformationGadget(#Edt, #TransformationGadget_Totale, 10)
ActiverTransformationGadget(#Btn, #TransformationGadget_Totale)
ActiverTransformationGadget(#TrB, #TransformationGadget_Position|#TransformationGadget_Horizontalement)
ActiverTransformationGadget(#Spn, #TransformationGadget_Position)
EndSelect
EndSelect
EndSelect
ForEver
CompilerEndIf
Bien que je trouve ton approche intéressante, mais il me semble qu'il y ait un problème avec les conteneurs.