Reste quelque imperfection si l’épaisseur est supérieur ou égale à 1.
J’espère que avec votre aide ont arrivera à régler ça.
Code : Tout sélectionner
Procedure CreateImageSelection(Gadget.i, X.i, Y.i, Largeur.i, Hauteur.i, CouleurSelection.i, CouleurInterieurSelection.i, Eppaiseur.i, Espace.i, Type.i)
If Largeur.i > 0 And Hauteur.i > 0
ImageSelection.i = CreateImage(#PB_Any, Largeur.i, Hauteur.i, 32, #PB_Image_Transparent)
If Gadget.i => 0 And IsGadget(Gadget.i) And IsImage(ImageSelection.i)
If StartVectorDrawing(ImageVectorOutput(ImageSelection.i))
; Si Alpha de la couleur intérieur est supérieur à 0, sert si vous voulez affichez que le contour de la selection par exemple.
If Alpha(CouleurInterieurSelection.i) > 0
; Eface l'image avec du blanc transparent totale.
AddPathBox(0, 0, ImageWidth(ImageSelection.i), ImageHeight(ImageSelection.i))
VectorSourceColor(RGBA(255, 255, 255, 255))
FillPath()
; Eface l'image avec du blanc transparent 0.
AddPathBox(0, 0, ImageWidth(ImageSelection.i), ImageHeight(ImageSelection.i))
VectorSourceColor(RGBA(255, 255, 255, 0))
FillPath()
; Eface l'image avec la couleur de la sélection.
AddPathBox(0, 0, ImageWidth(ImageSelection.i), ImageHeight(ImageSelection.i))
VectorSourceColor(CouleurInterieurSelection.i)
FillPath()
EndIf
If Eppaiseur.i <= 0
Eppaiseur.i = 1
EndIf
If Espace.i <= 0
Espace.i = 1
EndIf
If Type.i <= 0
Type.i = 1
ElseIf Type.i > 3
Type.i = 3
EndIf
; Dessine le contour de la selection sur l'image.
If Type.i = 1
; Ligne continue.
AddPathBox(Eppaiseur.i / 2, Eppaiseur.i / 2, (Largeur.i - Eppaiseur.i), (Hauteur.i - Eppaiseur.i))
VectorSourceColor(CouleurSelection.i)
StrokePath(Eppaiseur.i)
ElseIf Type.i = 2
; Carré.
AddPathBox(Eppaiseur.i / 2, Eppaiseur.i / 2, (Largeur.i - Eppaiseur.i), (Hauteur.i - Eppaiseur.i))
VectorSourceColor(CouleurSelection.i)
DotPath(Eppaiseur.i, Espace.i)
ElseIf Type.i = 3
; Tiret.
AddPathBox(Eppaiseur.i / 2, Eppaiseur.i / 2, (Largeur.i - Eppaiseur.i), (Hauteur.i - Eppaiseur.i))
VectorSourceColor(CouleurSelection.i)
DashPath(Eppaiseur.i, Espace.i)
EndIf
StopVectorDrawing()
ProcedureReturn ImageSelection.i
EndIf
EndIf
EndIf
EndProcedure
; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
; Test:
Enumeration
#Fenetre
#Canvas
EndEnumeration
Global CouleurContourSelection.i = RGBA(0, 150, 0, 0)
Global CouleurInterieurSelection.i = RGBA(0, 0, 200, 255)
Global TransparenceSelection.i = 255
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 0, 0, 1200, 800, "Fenetre windows", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
CanvasGadget(#Canvas, 0, 0, 800, 600)
; Ont affiche un carré pour l'éxemple.
If StartDrawing(CanvasOutput(#Canvas))
; Efface le Canvas avec la couleur blanche.
Box(0, 0, GadgetWidth(#Canvas), GadgetHeight(#Canvas), RGB(255, 255, 255))
; Déssine un carré rouge.
Box(100, 100, 150, 150, RGB(255, 0, 0))
StopDrawing()
EndIf
Repeat
Event = WaitWindowEvent(1)
EventGadget = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case #Canvas
If EventType() = #PB_EventType_LeftButtonDown
X1.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
Y1.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
ElseIf (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
X2.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
Y2.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
Largeur.i = X2 - X1
Hauteur.i = Y2 - Y1
; Note, si la transparence de "CouleurInterieurSelection" vaux 0, la transparence de "DrawSelection" n'affectera pas cette couleur qui restera
; transparente totale, mais seulement la couleur du contour de la selection, en gros vous ne verez que le contour de la sélection.
; Attention, ne dois jamais être mis dans un bloc StartDrawing() / StopDrawing() !
; Créer l'image de la sélection.
ImageSelection.i = CreateImageSelection(#Canvas, X1, Y1, Largeur, Hauteur, CouleurContourSelection.i, CouleurInterieurSelection.i, 1, 15, 1)
; Maintenant ont va afficher les objets et l'image de la sélection sur le Canvas.
If StartDrawing(CanvasOutput(#Canvas))
; Efface le Canvas avec la couleur blanche.
Box(0, 0, GadgetWidth(#Canvas), GadgetHeight(#Canvas), RGB(255, 255, 255))
; Déssine un carré rouge.
Box(100, 100, 150, 150, RGB(255, 0, 0))
If IsImage(ImageSelection.i)
; Dessine l'image de la sélection sur la Canvas.
DrawAlphaImage(ImageID(ImageSelection.i), X1.i, Y1.i, TransparenceSelection.i)
EndIf
StopDrawing()
; Attention, très très important, éffacer l'image de la sélection qui ne sert
; plus à rien Sinon les images vont s'accumulé dans la mémoire pour rien !
If IsImage(ImageSelection.i)
FreeImage(ImageSelection.i)
EndIf
EndIf
EndIf
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
EndProcedure
Ma_Fenetre()