Publié : jeu. 28/déc./2006 21:12
Voici un petit code GDI+ qui dessine un smiley avec 4 couleurs différentes
Je suis parti des tutos du site ChrystalXP.net et en particulier de ce tuto
http://www.crystalxp.net/tuto/fr11-tuto ... oshop.html
J'ai essayé de faire un truc qui ressemble un peu
Le code utilise un timer pour afficher les étapes successives pour dessiner le smiley (250 x250) et j'ai affiché 4 réductions qui sont de la taille des icônes XP.
Vous pourrez enregistrer les images (251 x 251) au format que vous voulez, il suffit dans la boucle d'évènements (Case #PB_Event_CloseWindow), de modifier la ligne du nom du fichier à enregistrer et éventuellement le décodeur d'image.
Les 4 gros smiley sont #Image, #Image1, #Image2 et #Image3
Il faut les 3 fichiers GDI+ mis à jour que vous trouverez en lien ici (les constantes, structures et l'ensemble des fonctions GDI+ )
Dans le fichier Gdiplus.pb, ainsi que l'exemple, il faut modifier le chemin des includefile.
Le fichier d'exemple est mettre dans le dossier qui est en rapport avec votre chemin pour Gdiplus.pb, ainsi que les fichiers de constantes et structure.
Pour les fainéants, j'ai fait un exe prêt à l'emploi (Smiley_Gdiplus.exe) mais il ne sauvegarde pas les images.
Le zip est ici

Voici le code (inclus aussi dans l'archive)
Je suis parti des tutos du site ChrystalXP.net et en particulier de ce tuto
http://www.crystalxp.net/tuto/fr11-tuto ... oshop.html
J'ai essayé de faire un truc qui ressemble un peu
Le code utilise un timer pour afficher les étapes successives pour dessiner le smiley (250 x250) et j'ai affiché 4 réductions qui sont de la taille des icônes XP.
Vous pourrez enregistrer les images (251 x 251) au format que vous voulez, il suffit dans la boucle d'évènements (Case #PB_Event_CloseWindow), de modifier la ligne du nom du fichier à enregistrer et éventuellement le décodeur d'image.
Les 4 gros smiley sont #Image, #Image1, #Image2 et #Image3
Il faut les 3 fichiers GDI+ mis à jour que vous trouverez en lien ici (les constantes, structures et l'ensemble des fonctions GDI+ )
Dans le fichier Gdiplus.pb, ainsi que l'exemple, il faut modifier le chemin des includefile.
Le fichier d'exemple est mettre dans le dossier qui est en rapport avec votre chemin pour Gdiplus.pb, ainsi que les fichiers de constantes et structure.
Pour les fainéants, j'ai fait un exe prêt à l'emploi (Smiley_Gdiplus.exe) mais il ne sauvegarde pas les images.
Le zip est ici

Voici le code (inclus aussi dans l'archive)
Code : Tout sélectionner
XIncludeFile "../../../gdiplus.pbi"
EnableExplicit
Enumeration
#MainWindow
#ImageGadget = 0
#ImageGadget1
#ImageGadget2
#ImageGadget3
#ImageGadgetOeuilDroit
#ImageGadgetOeuilGauche
#ImageGadget_48x48
#ImageGadget_32x32
#ImageGadget_24x24
#ImageGadget_16x16
#ImageGadget1_48x48
#ImageGadget1_32x32
#ImageGadget1_24x24
#ImageGadget1_16x16
#ImageGadget2_48x48
#ImageGadget2_32x32
#ImageGadget2_24x24
#ImageGadget2_16x16
#ImageGadget3_48x48
#ImageGadget3_32x32
#ImageGadget3_24x24
#ImageGadget3_16x16
#Textgadget
#Textgadget1
#Textgadget2
#Textgadget3
#Textgadget_eclairage_central
#Textgadget_Fond_Image
#Textgadget_Fond_global
#Textgadget_Contour
#Textgadget_FondOeuil
#Textgadget_ContourOeuil
#Textgadget_Pupille
#Textgadget_RefletPupille
#Textgadget_Sourcils
#Textgadget_Bouche
#Textgadget_Dents
#Image = 0
#Image1
#Image2
#Image3
#ImageOeuil
#Image_256x256
#Image_48x48
#Image_32x32
#Image_24x24
#Image_16x16
#Image1_256x256
#Image1_48x48
#Image1_32x32
#Image1_24x24
#Image1_16x16
#Image2_256x256
#Image2_48x48
#Image2_32x32
#Image2_24x24
#Image2_16x16
#Image3_256x256
#Image3_48x48
#Image3_32x32
#Image3_24x24
#Image3_16x16
#Font
EndEnumeration
#DiametreSphere = 200
#Diametre_H_SphereOeuil = 90
#Diametre_V_SphereOeuil = #Diametre_H_SphereOeuil / 2.0
#EpaisseurContour = 4
#largeurBouche = 70
#Timer = 10
Define .l
Global *token, *gfx1, *brush1, *Pen1, *path, *path1, *matrix, *region, *hDC
Global count.l, status.l, timer.l = 1100, Operation.l = 0
Global rc_Sphere.RectF, rc_BrushInterieure.RectF
Global Dim pt.Point(6), pt1.PointF
Global Dim CouleurInterieure.l(3), count.l
Global Dim CouleurInterieure1.l(3)
Global Dim CouleurInterieure2.l(3)
Global Dim CouleurInterieure3.l(3)
Global pt5_1.Point, pt5_2.Point
Macro Fermeture_GdiPlus
If *hDC
StopDrawing()
*hDC = 0
EndIf
If *gfx1
GdipDeleteGraphics(*gfx1)
*gfx1 = 0
EndIf
GdiplusShutdown(*token) : *token = 0
EndMacro
Macro Initialise_GdiPlus()
*token = Gdiplus_New()
EndMacro
Procedure.l GdipCreateMatrix2Ex(ScaleX.f, ScaleY.f, Angle.f, TranslateX.f, TranslateY.f)
; ScaleX --> facteur d'échelle voulu en X
; ScaleY --> facteur d'échelle voulu en Y
; Angle --> angle de rotation voulu en degrés
; TranslateX --> valeur de la translation voulue en X
; TranslateY --> valeur de la translation voulue en Y
; retourne 0 si la matrice n'a pas pu être initialisée
; sinon retroune l'ID système de la matrice
Protected AngleRadian.f, *Localmatrix
AngleRadian = #PI / 180 * Angle
If GdipCreateMatrix2(ScaleX * Cos(AngleRadian), ScaleY * Sin(AngleRadian), ScaleX * (-Sin(AngleRadian)), ScaleY * Cos(AngleRadian), TranslateX, TranslateY, @*Localmatrix) = #Ok
ProcedureReturn *Localmatrix
Else
ProcedureReturn 0
EndIf
EndProcedure
Procedure.l Creation_Graphics(Image)
; on vérifie que l'initialisation est Ok
If *token
*hDC = 0
; création de l'objet graphique associé à l'image
*hDC = StartDrawing(ImageOutput(Image))
If *hDC
*gfx1 = 0
If GdipCreateFromHDC(*hDC, @*gfx1) = #Ok
GdipSetSmoothingMode(*gfx1, 2)
Else
*gfx1 = 0
StopDrawing()
EndIf
Else
*hDC
EndIf
EndIf
ProcedureReturn * gfx1
EndProcedure
Procedure Mise_A_jour_Miniatures()
SetGadgetState(#ImageGadget, ImageID(#Image))
SetGadgetState(#ImageGadget1, ImageID(#Image1))
SetGadgetState(#ImageGadget2, ImageID(#Image2))
SetGadgetState(#ImageGadget3, ImageID(#Image3))
CopyImage(#Image, #Image_256x256)
If IsImage(#Image_48x48)
ResizeImage(#Image_256x256, 48, 48)
CopyImage(#Image_256x256, #Image_48x48)
SetGadgetState(#ImageGadget_48x48, ImageID(#Image_48x48))
EndIf
CopyImage(#Image1, #Image1_256x256)
If IsImage(#Image1_48x48)
ResizeImage(#Image1_256x256, 48, 48)
CopyImage(#Image1_256x256, #Image1_48x48)
SetGadgetState(#ImageGadget1_48x48, ImageID(#Image1_48x48))
EndIf
CopyImage(#Image2, #Image2_256x256)
If IsImage(#Image2_48x48)
ResizeImage(#Image2_256x256, 48, 48)
CopyImage(#Image2_256x256, #Image2_48x48)
SetGadgetState(#ImageGadget2_48x48, ImageID(#Image2_48x48))
EndIf
CopyImage(#Image3, #Image3_256x256)
If IsImage(#Image3_48x48)
ResizeImage(#Image3_256x256, 48, 48)
CopyImage(#Image3_256x256, #Image3_48x48)
SetGadgetState(#ImageGadget3_48x48, ImageID(#Image3_48x48))
EndIf
CopyImage(#Image, #Image_256x256)
If IsImage(#Image_32x32)
ResizeImage(#Image_256x256, 32, 32)
CopyImage(#Image_256x256, #Image_32x32)
SetGadgetState(#ImageGadget_32x32, ImageID(#Image_32x32))
EndIf
CopyImage(#Image1, #Image1_256x256)
If IsImage(#Image1_32x32)
ResizeImage(#Image1_256x256, 32, 32)
CopyImage(#Image1_256x256, #Image1_32x32)
SetGadgetState(#ImageGadget1_32x32, ImageID(#Image1_32x32))
EndIf
CopyImage(#Image2, #Image2_256x256)
If IsImage(#Image2_32x32)
ResizeImage(#Image2_256x256, 32, 32)
CopyImage(#Image2_256x256, #Image2_32x32)
SetGadgetState(#ImageGadget2_32x32, ImageID(#Image2_32x32))
EndIf
CopyImage(#Image3, #Image3_256x256)
If IsImage(#Image3_32x32)
ResizeImage(#Image3_256x256, 32, 32)
CopyImage(#Image3_256x256, #Image3_32x32)
SetGadgetState(#ImageGadget3_32x32, ImageID(#Image3_32x32))
EndIf
CopyImage(#Image, #Image_256x256)
If IsImage(#Image_24x24)
ResizeImage(#Image_256x256, 24, 24)
CopyImage(#Image_256x256, #Image_24x24)
SetGadgetState(#ImageGadget_24x24, ImageID(#Image_24x24))
EndIf
CopyImage(#Image1, #Image1_256x256)
If IsImage(#Image1_24x24)
ResizeImage(#Image1_256x256, 24, 24)
CopyImage(#Image1_256x256, #Image1_24x24)
SetGadgetState(#ImageGadget1_24x24, ImageID(#Image1_24x24))
EndIf
CopyImage(#Image2, #Image2_256x256)
If IsImage(#Image2_24x24)
ResizeImage(#Image2_256x256, 24, 24)
CopyImage(#Image2_256x256, #Image2_24x24)
SetGadgetState(#ImageGadget2_24x24, ImageID(#Image2_24x24))
EndIf
CopyImage(#Image3, #Image3_256x256)
If IsImage(#Image3_24x24)
ResizeImage(#Image3_256x256, 24, 24)
CopyImage(#Image3_256x256, #Image3_24x24)
SetGadgetState(#ImageGadget3_24x24, ImageID(#Image3_24x24))
EndIf
CopyImage(#Image, #Image_256x256)
If IsImage(#Image_16x16)
ResizeImage(#Image_256x256, 16, 16)
CopyImage(#Image_256x256, #Image_16x16)
SetGadgetState(#ImageGadget_16x16, ImageID(#Image_16x16))
EndIf
CopyImage(#Image1, #Image1_256x256)
If IsImage(#Image1_16x16)
ResizeImage(#Image1_256x256, 16, 16)
CopyImage(#Image1_256x256, #Image1_16x16)
SetGadgetState(#ImageGadget1_16x16, ImageID(#Image1_16x16))
EndIf
CopyImage(#Image2, #Image_256x256)
If IsImage(#Image2_16x16)
ResizeImage(#Image2_256x256, 16, 16)
CopyImage(#Image2_256x256, #Image2_16x16)
SetGadgetState(#ImageGadget2_16x16, ImageID(#Image2_16x16))
EndIf
CopyImage(#Image3, #Image3_256x256)
If IsImage(#Image3_16x16)
ResizeImage(#Image3_256x256, 16, 16)
CopyImage(#Image3_256x256, #Image3_16x16)
SetGadgetState(#ImageGadget3_16x16, ImageID(#Image3_16x16))
EndIf
EndProcedure
Procedure Dessine_FondImage(StaticImageId_9)
Initialise_GdiPlus()
If Creation_Graphics(StaticImageId_9)
GdipGraphicsClear(*gfx1, ARGB(GetSysColor_(#COLOR_BTNFACE)))
EndIf
Fermeture_GdiPlus
EndProcedure
Procedure Dessine_FondGlobal(StaticImageId_8) ; fond de la sphère
Protected couleur
Select StaticImageId_8
Case #Image
couleur = $0594B3
Case #Image1
couleur = #Red
Case #Image2
couleur = $9C983B ; $C3BF61
Case #Image3
couleur = $5C823D ; $89BD76
EndSelect
Initialise_GdiPlus()
If Creation_Graphics(StaticImageId_8)
;- création du contour
If GdipCreateSolidFill(ARGB(couleur), @*brush1) = #Ok
GdipFillEllipseI(*gfx1, *brush1, rc_Sphere\x, rc_Sphere\y, rc_Sphere\width, rc_Sphere\height)
GdipSetSmoothingMode(*gfx1, 2)
GdipDeleteBrush(*brush1) : *brush1 = 0
EndIf
EndIf
Fermeture_GdiPlus
EndProcedure
Procedure Dessine_Eclaire_Fond(StaticImageId_7)
Protected couleur, *TableauCouleur
Select StaticImageId_7
Case #Image
couleur = $11DEFA
*TableauCouleur = @CouleurInterieure()
Case #Image1
couleur = $81AFF5
*TableauCouleur = @CouleurInterieure1()
Case #Image2
couleur = $E0CE9D
*TableauCouleur = @CouleurInterieure2()
Case #Image3
couleur = $C4E8A6
*TableauCouleur = @CouleurInterieure3()
EndSelect
Initialise_GdiPlus()
If Creation_Graphics(StaticImageId_7)
; création dégradé linéaire blanc en haut et transparent en bas
pt(0)\x = 0 : pt(0)\y = 0
pt(1)\x = rc_Sphere\x + #EpaisseurContour : pt(1)\y = 0
pt(2)\x = rc_Sphere\x + #EpaisseurContour : pt(1)\y = rc_Sphere\y + #EpaisseurContour
pt(3)\x = 0 : pt(1)\y = rc_Sphere\y + #EpaisseurContour
status = GdipCreatePath(#FillModeAlternate, @*path)
If status <> #ok
MessageRequester("Erreur", "GdipCreatePath a échouée" + Chr(10) + "et a retourné l'erreur " + Str(status), 16)
Else
status = GdipAddPathEllipse(*path, 0, 0, rc_Sphere\width + 50, rc_Sphere\height + 50)
If status <> #ok
MessageRequester("Erreur", "GdipAddPathEllipse a échouée" + Chr(10) + "et a retourné l'erreur " + Str(status), 16)
Else
status = GdipCreatePathGradientFromPath(*path, @*brush1)
If status <> #ok
MessageRequester("Erreur", "GdipCreatePathGradientFromPath a échouée" + Chr(10) + "et a retourné l'erreur " + Str(status), 16)
Else
GdipSetPathGradientCenterColor(*brush1, ARGB(couleur))
pt1\x = (#DiametreSphere / 2) - 25
pt1\y = (#DiametreSphere / 2) - 25
GdipSetPathGradientCenterPoint(*Brush1, @pt1)
count = 1
GdipSetPathGradientSurroundColorsWithCount(*brush1, *TableauCouleur, @count)
GdipSetLineSigmaBlend(*brush1, 1, 1)
GdipSetSmoothingMode(*gfx1, 2)
GdipFillEllipseI(*gfx1, *brush1, rc_Sphere\x + #EpaisseurContour - 3, rc_Sphere\y + #EpaisseurContour, rc_Sphere\width - #EpaisseurContour, rc_Sphere\height - #EpaisseurContour )
GdipDeleteBrush(*brush1) : *brush1 = 0
EndIf
EndIf
GdipDeletePath(*path) : *path = 0
EndIf
EndIf
Fermeture_GdiPlus
EndProcedure
Procedure Dessine_Degrade_Fond(StaticImageId_6)
Protected couleur
If StaticImageId_6 = #Image
couleur = $0594B3
Else
couleur = #Red
EndIf
Initialise_GdiPlus()
If Creation_Graphics(StaticImageId_6)
rc_Sphere\x = 0
rc_Sphere\y = 0
rc_Sphere\width = #DiametreSphere
rc_Sphere\height = #DiametreSphere
status = GdipCreateLineBrushFromRect( @rc_BrushInterieure, ARGB(#White, 240), ARGB(couleur, 0), #LinearGradientModeVertical, #WrapModeTile, @*brush1)
If status <> #ok
MessageRequester("Erreur", "GdipCreateLineBrushFromRect a échouée" + Chr(10) + "et a retourné l'erreur " + Str(status), 16)
Else
CopyRectF( @rc_Sphere, @rc_BrushInterieure)
GdipSetSmoothingMode(*gfx1, 2)
GdipFillEllipseI(*gfx1, *brush1, rc_Sphere\x + #EpaisseurContour, rc_Sphere\y + #EpaisseurContour, rc_Sphere\width - (#EpaisseurContour * 2), rc_Sphere\height - (#EpaisseurContour * 2))
GdipDeleteBrush(*brush1) : *brush1 = 0
EndIf
EndIf
Fermeture_GdiPlus
EndProcedure
Procedure Dessine_FondOeuil(StaticImageId_5)
Initialise_GdiPlus()
If Creation_Graphics(StaticImageId_5)
pt5_1\x = 50 : pt5_1\y = 25 : pt5_2\x = 50 + #Diametre_V_SphereOeuil : pt5_2\y = 25 + #Diametre_H_SphereOeuil
GdipCreateLineBrushI( @pt5_1, @pt5_2, ARGB($B1B1B1), ARGB(#White), #WrapModeTile, @*brush1)
GdipFillEllipseI(*gfx1, *brush1, 50, 25, #Diametre_V_SphereOeuil, #Diametre_H_SphereOeuil )
GdipTranslateLineTransform(*brush1, -170, 0, #MatrixOrderPrepend)
GdipFillEllipseI(*gfx1, *brush1, 110, 25, #Diametre_V_SphereOeuil, #Diametre_H_SphereOeuil )
GdipDeleteBrush(*brush1) : *brush1 = 0
EndIf
Fermeture_GdiPlus
EndProcedure
Procedure Dessine_ContourOeuil(StaticImageId_4)
Protected couleur
Select StaticImageId_4
Case #Image
couleur = $0594B3
Case #Image1
couleur = #Red
Case #Image2
couleur = $9C983B
Case #Image3
couleur = $5C823D
EndSelect
Initialise_GdiPlus()
If Creation_Graphics(StaticImageId_4)
; création des orbites des yeux
If GdipCreatePen1(ARGB(couleur), 2.0, #UnitPixel, @*Pen1) = #Ok
; dessine les contours de l'orbite oeuil gauche
GdipDrawEllipseI(*gfx1, *Pen1, 50, 25, #Diametre_V_SphereOeuil, #Diametre_H_SphereOeuil )
; dessine les contours de l'orbite oeuil droit
GdipDrawEllipseI(*gfx1, *Pen1, 110, 25, #Diametre_V_SphereOeuil, #Diametre_H_SphereOeuil )
GdipDeletePen(*Pen1) : *Pen1 = 0
EndIf
EndIf
Fermeture_GdiPlus
EndProcedure
Procedure Dessine_Pupille(StaticImageId_3)
Protected couleur
Select StaticImageId_3
Case #Image
couleur = #Black
Case #Image1
couleur = $00138D
Case #Image2
couleur = $9C983B
Case #Image3
couleur = $5C823D
EndSelect
Initialise_GdiPlus()
If Creation_Graphics(StaticImageId_3)
; création de des yeux noirs
If GdipCreateSolidFill(ARGB(couleur), @*brush1) = #Ok
GdipFillEllipseI(*gfx1, *brush1, 40 + (#Diametre_V_SphereOeuil / 2), 25 + (#Diametre_H_SphereOeuil / 2), 22, 30)
GdipFillEllipseI(*gfx1, *brush1, 100 + (#Diametre_V_SphereOeuil / 2), 25 + (#Diametre_H_SphereOeuil / 2), 22, 30)
GdipDeleteBrush(*brush1) : *brush1 = 0
EndIf
EndIf
Fermeture_GdiPlus
EndProcedure
Procedure Dessine_Reflet_Pupille(StaticImageId_2)
Protected couleur
Select StaticImageId_2
Case #Image
couleur = #Black
Case #Image1
couleur = $00138D
Case #Image2
couleur = $9C983B
Case #Image3
couleur = $5C823D
EndSelect
Initialise_GdiPlus()
If Creation_Graphics(StaticImageId_2)
If Operation = 8
pt5_1\x = 0 : pt5_1\y = 0 : pt5_2\x = 0 : pt5_2\y = 35
If GdipCreateLineBrushI( @pt5_1, @pt5_2, ARGB(#White, 255), ARGB(#White, 0), #WrapModeTile, @*brush1) = #Ok
GdipFillEllipseI(*gfx1, *brush1, 63.5, 73, 20, 25)
GdipFillEllipseI(*gfx1, *brush1, 63.5 + 60, 73, 20, 25)
GdipDeleteBrush(*brush1) : *brush1 = 0
EndIf
Else
pt5_1\x = 0 : pt5_1\y = 0 : pt5_2\x = 0 : pt5_2\y = 35
If GdipCreateLineBrushI( @pt5_1, @pt5_2, ARGB(couleur, 150), ARGB(couleur, 255), #WrapModeTile, @*brush1) = #Ok
GdipFillEllipseI(*gfx1, *brush1, 63.5, 73 + 3, 18, 20)
GdipFillEllipseI(*gfx1, *brush1, 63.5 + 60, 73 + 3, 18, 20)
GdipDeleteBrush(*brush1) : *brush1 = 0
EndIf
EndIf
EndIf
Fermeture_GdiPlus
EndProcedure
Procedure Dessine_Sourcils(StaticImageId_1)
Protected couleur
If StaticImageId_1 <> #Image1
couleur = #Black
Else
couleur = $0C4D93
EndIf
Initialise_GdiPlus()
If Creation_Graphics(StaticImageId_1)
; sourcil gauche
If GdipCreateSolidFill(ARGB(couleur), @*brush1) = #Ok
Pt(0)\x = 45 : Pt(0)\y = 30 - 3
Pt(1)\x = Pt(0)\x + 30 : Pt(1)\y = Pt(0)\y - 25
Pt(2)\x = Pt(0)\x + 55 : Pt(2)\y = Pt(0)\y - 5
Pt(3)\x = Pt(0)\x + 30 : Pt(3)\y = Pt(0)\y - 12
Pt(4)\x = Pt(0)\x + 5 : Pt(4)\y = Pt(0)\y + 5
GdipFillClosedCurve2I(*gfx1, *brush1, @Pt(), 5, 0.6, #FillModeAlternate)
; sourcil droit avec rotation angulaire
status = GdipCreatePath(#FillModeAlternate, @*path)
If status <> #ok
MessageRequester("Erreur", "GdipCreatePath a échouée" + Chr(10) + "et a retourné l'erreur " + Str(status), 16)
Else
Pt(0)\x = 110 + 50 : Pt(0)\y = 30
Pt(1)\x = Pt(0)\x - 30 : Pt(1)\y = Pt(0)\y - 25
Pt(2)\x = Pt(0)\x - 55 : Pt(2)\y = Pt(0)\y - 5
Pt(3)\x = Pt(0)\x - 30 : Pt(3)\y = Pt(0)\y - 12
Pt(4)\x = Pt(0)\x - 5 : Pt(4)\y = Pt(0)\y + 5
*matrix = GdipCreateMatrix2Ex(1, 1, -20, 0, 50)
If *matrix
GdipAddPathClosedCurve2I(*path, @Pt(), 5, 0.6)
GdipTransformPath(*path, *matrix)
GdipFillPath(*gfx1, *brush1, *path)
GdipDeleteMatrix(*matrix) : *matrix = 0
EndIf
GdipDeletePath(*path) : *path = 0
EndIf
GdipDeleteBrush(*brush1) : *brush1 = 0
EndIf
EndIf
Fermeture_GdiPlus
EndProcedure
Procedure Dessine_Dentition(StaticImageId)
Initialise_GdiPlus()
If Not(Creation_Graphics(StaticImageId))
Fermeture_GdiPlus
Else
; dessine les dents supérieures/inférieures
status = GdipCreatePath(#FillModeAlternate, @*path)
Select status
Case #ok
GdipAddPathEllipse(*path, 43, 130, #largeurBouche + 40, 28)
GdipAddPathEllipse(*path, 43, 169, #largeurBouche + 40, 23)
status = GdipCreatePath(#FillModeAlternate, @*path1)
Select status
Case #ok
Pt(0)\x = 64 : Pt(0)\y = 139
Pt(1)\x = Pt(0)\x + (#largeurBouche / 2) : Pt(1)\y = Pt(0)\y + 08
Pt(2)\x = Pt(0)\x + #largeurBouche + 2 : Pt(2)\y = Pt(0)\y = 140
Pt(3)\x = Pt(0)\x + #largeurBouche : Pt(3)\y = Pt(0)\y + 30 + 2
Pt(4)\x = Pt(0)\x + (#largeurBouche / 2) : Pt(4)\y = Pt(3)\y + 15 - 7
Pt(5)\x = Pt(0)\x : Pt(5)\y = Pt(3)\y
GdipAddPathClosedCurve2I(*path1, @Pt(), 6, 0.60)
status = GdipCreateRegionPath(*path, @*region)
Select status
Case #ok
GdipCombineRegionPath(*region, *path1, #CombineModeIntersect)
Pt(0)\x = 64 : Pt(0)\y = 139
Pt(1)\x = Pt(0)\x + #largeurBouche : Pt(1)\y = Pt(0)\y
Pt(2)\x = Pt(0)\x + #largeurBouche : Pt(2)\y = Pt(4)\y + 20
Pt(3)\x = Pt(0)\x : Pt(3)\y = Pt(4)\y
If GdipCreatePathGradientI( @pt(), 4, #WrapModeTile, @*brush1) = #Ok
count = 4
CouleurInterieure(0) = ARGB($979696)
CouleurInterieure(1) = ARGB($979696)
CouleurInterieure(2) = ARGB($979696)
CouleurInterieure(3) = ARGB($979696)
GdipSetPathGradientCenterColor(*brush1, ARGB(#White))
GdipSetPathGradientSurroundColorsWithCount(*brush1, @CouleurInterieure(), @count)
GdipFillRegion(*gfx1, *brush1, *region)
GdipDeleteBrush(*brush1) : *brush1 = 0
EndIf
GdipDeleteRegion(*region) : *region = 0
GdipDeletePath(*path1) : *path1 = 0
Default
MessageRequester("Erreur", "GdipCreateRegionPath a échouée" + Chr(10) + "et a retourné l'erreur " + Str(status), 16)
EndSelect
GdipDeletePath(*path1) : *path1 = 0
Default
MessageRequester("Erreur", "GdipCreatePath a échouée" + Chr(10) + "et a retourné l'erreur " + Str(status), 16)
EndSelect
GdipDeletePath(*path) : *path = 0
Default
MessageRequester("Erreur", "GdipCreatePath a échouée" + Chr(10) + "et a retourné l'erreur " + Str(status), 16)
EndSelect
; les lunettes
If StaticImageId = #Image1
If GdipCreatePen1(ARGB(0), 4, #UnitPixel, @*pen1) = #Ok
GdipDrawLineI(*gfx1, *pen1, 95, 80, 115, 80)
GdipDrawEllipseI(*gfx1, *pen1, 53, 65, 40, 40)
GdipDrawEllipseI(*gfx1, *pen1, 113, 65, 40, 40)
GdipDrawLineI(*gfx1, *pen1, 5, 65, 53, 80)
GdipDrawLineI(*gfx1, *pen1, 53 + 144, 65, 5 + 145, 80)
GdipDeletePen(*pen1) : *pen1 = 0
EndIf
EndIf
Fermeture_GdiPlus
EndIf
EndProcedure
Procedure Dessine_Bouche(StaticImageId_0)
Protected couleur
If StaticImageId_0 <> #Image1
couleur = #Black
Else
couleur = $0C4D93
EndIf
Initialise_GdiPlus()
Pt(0)\x = 65 : Pt(0)\y = 140
Pt(1)\x = Pt(0)\x + (#largeurBouche / 2) : Pt(1)\y = Pt(0)\y + 08
Pt(2)\x = Pt(0)\x + #largeurBouche : Pt(2)\y = Pt(0)\y = 140
Pt(3)\x = Pt(0)\x + #largeurBouche : Pt(3)\y = Pt(0)\y + 30
Pt(4)\x = Pt(0)\x + (#largeurBouche / 2) : Pt(4)\y = Pt(3)\y + 15 - 7
Pt(5)\x = Pt(0)\x : Pt(5)\y = Pt(3)\y
If Creation_Graphics(StaticImageId_0)
If GdipCreateSolidFill(ARGB(couleur), @*brush1) = #Ok
GdipFillClosedCurve2I(*gfx1, *brush1, @Pt(), 6, 0.60, #FillModeAlternate)
GdipDeleteBrush(*brush1) : *brush1 = 0
EndIf
EndIf
Fermeture_GdiPlus
EndProcedure
;- <<********** fenêtre **********>>
If OpenWindow(#MainWindow, 0, 0, 900, 600, "GdiPlus 1.0 - Smiley", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Invisible)
SetTimer_(WindowID(#MainWindow), #Timer, timer, 0)
If CreateGadgetList(WindowID(#MainWindow))
If CreateImage(#Image, #DiametreSphere + 3, #DiametreSphere + 3, 32)
If ImageGadget(#ImageGadget, 10, 10, 0, 0, ImageID(#Image))
If CreateImage(#Image_256x256, 256, 256, 32)
CopyImage(#Image_256x256, #Image1_256x256)
CopyImage(#Image_256x256, #Image2_256x256)
CopyImage(#Image_256x256, #Image3_256x256)
If CopyImage(#Image, #Image1) And ImageGadget(#ImageGadget1, 10, 320, 0, 0, ImageID(#Image1))
If CopyImage(#Image, #Image2) And ImageGadget(#ImageGadget2, 650, 10, 0, 0, ImageID(#Image2))
If CopyImage(#Image, #Image3) And ImageGadget(#ImageGadget3, 650, 320, 0, 0, ImageID(#Image3))
If GrabImage(#Image_256x256, #Image_48x48, 0, 0, 48, 48)
ImageGadget(#ImageGadget_48x48, 25, 220, 0, 0, ImageID(#Image_48x48))
EndIf
If GrabImage(#Image1_256x256, #Image1_48x48, 0, 0, 48, 48)
ImageGadget(#ImageGadget1_48x48, 25, 530, 0, 0, ImageID(#Image1_48x48))
EndIf
If GrabImage(#Image2_256x256, #Image2_48x48, 0, 0, 48, 48)
ImageGadget(#ImageGadget2_48x48, 650, 220, 0, 0, ImageID(#Image2_48x48))
EndIf
If GrabImage(#Image3_256x256, #Image3_48x48, 0, 0, 48, 48)
ImageGadget(#ImageGadget3_48x48, 650, 530, 0, 0, ImageID(#Image3_48x48))
EndIf
If GrabImage(#Image_256x256, #Image_32x32, 0, 0, 32, 32)
ImageGadget(#ImageGadget_32x32, 90, 268 - 32, 0, 0, ImageID(#Image_32x32))
EndIf
If GrabImage(#Image1_256x256, #Image1_32x32, 0, 0, 32, 32)
ImageGadget(#ImageGadget1_32x32, 90, 530 + 48 - 32, 0, 0, ImageID(#Image1_32x32))
EndIf
If GrabImage(#Image2_256x256, #Image2_32x32, 0, 0, 32, 32)
ImageGadget(#ImageGadget2_32x32, 650 + 65, 268 - 32, 0, 0, ImageID(#Image2_32x32))
EndIf
If GrabImage(#Image3_256x256, #Image3_32x32, 0, 0, 32, 32)
ImageGadget(#ImageGadget3_32x32, 650 + 65, 530 + 48 - 32, 0, 0, ImageID(#Image3_32x32))
EndIf
If GrabImage(#Image_256x256, #Image_24x24, 0, 0, 24, 24)
ImageGadget(#ImageGadget_24x24, 145, 268 - 24, 0, 0, ImageID(#Image_24x24))
EndIf
If GrabImage(#Image1_256x256, #Image1_24x24, 0, 0, 24, 24)
ImageGadget(#ImageGadget1_24x24, 145, 530 + 48 - 24, 0, 0, ImageID(#Image1_24x24))
EndIf
If GrabImage(#Image2_256x256, #Image2_24x24, 0, 0, 24, 24)
ImageGadget(#ImageGadget2_24x24, 650 + 120, 268 - 24, 0, 0, ImageID(#Image2_24x24))
EndIf
If GrabImage(#Image3_256x256, #Image3_24x24, 0, 0, 24, 24)
ImageGadget(#ImageGadget3_24x24, 650 + 120, 530 + 48 - 24, 0, 0, ImageID(#Image3_24x24))
EndIf
If GrabImage(#Image_256x256, #Image_16x16, 0, 0, 16, 16)
ImageGadget(#ImageGadget_16x16, 200, 268 - 16, 0, 0, ImageID(#Image_16x16))
EndIf
If GrabImage(#Image1_256x256, #Image1_16x16, 0, 0, 16, 16)
ImageGadget(#ImageGadget1_16x16, 200, 530 + 48 - 16, 0, 0, ImageID(#Image1_16x16))
EndIf
If GrabImage(#Image2_256x256, #Image2_16x16, 0, 0, 16, 16)
ImageGadget(#ImageGadget2_16x16, 650 + 175, 268 - 16, 0, 0, ImageID(#Image2_16x16))
EndIf
If GrabImage(#Image3_256x256, #Image3_16x16, 0, 0, 16, 16)
ImageGadget(#ImageGadget3_16x16, 650 + 175, 530 + 48 - 16, 0, 0, ImageID(#Image3_16x16))
EndIf
EndIf
TextGadget(#Textgadget, 30, 270, WindowWidth(#MainWindow) - 20, 20, "48x48" + Space(6) + "32x32" + Space(4) + "24x24" + Space(4) + "16x16")
SetGadgetFont(#Textgadget, LoadFont(#Font, "ARIAL", 10))
TextGadget(#Textgadget1, 30, 580, WindowWidth(#MainWindow) - 20, 20, "48x48" + Space(6) + "32x32" + Space(4) + "24x24" + Space(4) + "16x16")
SetGadgetFont(#Textgadget1, FontID(#Font))
TextGadget(#Textgadget2, 655, 270, WindowWidth(#MainWindow) - 20, 20, "48x48" + Space(6) + "32x32" + Space(4) + "24x24" + Space(4) + "16x16")
SetGadgetFont(#Textgadget2, FontID(#Font))
TextGadget(#Textgadget3, 655, 580, WindowWidth(#MainWindow) - 20, 20, "48x48" + Space(6) + "32x32" + Space(4) + "24x24" + Space(4) + "16x16")
SetGadgetFont(#Textgadget3, FontID(#Font))
TextGadget(#Textgadget_Fond_Image, 310, 25, 250, 20, "Fond Image (identique fond fenêtre)")
SetGadgetFont(#Textgadget_Fond_Image, FontID(#Font))
TextGadget(#Textgadget_Fond_global, 310, 50, 150, 20, "Fond global de la sphère")
SetGadgetFont(#Textgadget_Fond_global, FontID(#Font))
TextGadget(#Textgadget_eclairage_central, 310, 75, 150, 20, "éclairage central")
SetGadgetFont(#Textgadget_eclairage_central, FontID(#Font))
TextGadget(#Textgadget_Contour, 310, 100, 300, 20, "Dégradé linéaire sur la sphère formant le contour")
SetGadgetFont(#Textgadget_Contour, FontID(#Font))
TextGadget(#Textgadget_FondOeuil, 310, 125, 300, 20, "Fond des yeux en dégradé linéaire gris/blanc")
SetGadgetFont(#Textgadget_FondOeuil, FontID(#Font))
TextGadget(#Textgadget_ContourOeuil, 310, 150, 300, 20, "Contour des yeux")
SetGadgetFont(#Textgadget_ContourOeuil, FontID(#Font))
TextGadget(#Textgadget_Pupille, 310, 175, 300, 20, "Pupille noire des yeux")
SetGadgetFont(#Textgadget_Pupille, FontID(#Font))
TextGadget(#Textgadget_RefletPupille, 310, 200, 300, 20, "Reflet blanchâtre sur les pupilles (en 2 temps)")
SetGadgetFont(#Textgadget_RefletPupille, FontID(#Font))
TextGadget(#Textgadget_Sourcils, 310, 225, 300, 20, "Sourcils")
SetGadgetFont(#Textgadget_Sourcils, FontID(#Font))
TextGadget(#Textgadget_Bouche, 310, 250, 300, 20, "Bouche")
SetGadgetFont(#Textgadget_Bouche, FontID(#Font))
TextGadget(#Textgadget_Dents, 310, 275, 300, 20, "Dentition")
SetGadgetFont(#Textgadget_Dents, FontID(#Font))
rc_Sphere\x = 1
rc_Sphere\y = 1
rc_Sphere\width = #DiametreSphere
rc_Sphere\height = #DiametreSphere
CopyRectF( @rc_Sphere, @rc_BrushInterieure)
CouleurInterieure(0) = ARGB($0594B3)
CouleurInterieure(1) = ARGB(#White)
CouleurInterieure(2) = ARGB($CECECE)
CouleurInterieure(3) = ARGB(#White)
CouleurInterieure1(0) = ARGB(#Red)
CouleurInterieure1(1) = ARGB(#White)
CouleurInterieure1(2) = ARGB($CECECE)
CouleurInterieure1(3) = ARGB(#White)
CouleurInterieure2(0) = ARGB($9C983B)
CouleurInterieure2(1) = ARGB(#White)
CouleurInterieure2(2) = ARGB($C3BF61)
CouleurInterieure2(3) = ARGB(#White)
CouleurInterieure3(0) = ARGB($5C823D)
CouleurInterieure3(1) = ARGB(#White)
CouleurInterieure3(2) = ARGB($89BD76)
CouleurInterieure3(3) = ARGB(#White)
HideWindow(#MainWindow, 0)
SetGadgetColor(#Textgadget_Fond_Image, #PB_Gadget_FrontColor, #Red)
;- Boucle
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
UsePNGImageEncoder()
; SaveImage(#Image, "Smiley_GDIplus.png", #PB_ImagePlugin_PNG)
Break
Case #WM_TIMER
If EventwParam() = #Timer
Operation + 1
Select Operation
Case 1 ; Couleur du fond du graphique identique à la fenêtre
Dessine_FondImage(#Image)
Dessine_FondImage(#Image1)
Dessine_FondImage(#Image2)
Dessine_FondImage(#Image3)
Mise_A_jour_Miniatures()
;- fond global sphère
Case 2 ; dessine le fond global
SetGadgetColor(#Textgadget_Fond_Image, #PB_Gadget_FrontColor, $C0C0C0)
SetGadgetColor(#Textgadget_Fond_global, #PB_Gadget_FrontColor, #Red)
Dessine_FondGlobal(#Image)
Dessine_FondGlobal(#Image1)
Dessine_FondGlobal(#Image2)
Dessine_FondGlobal(#Image3)
Mise_A_jour_Miniatures()
;- éclairage central
Case 3 ; éclairage central
SetGadgetColor(#Textgadget_Fond_global, #PB_Gadget_FrontColor, $C0C0C0)
SetGadgetColor(#Textgadget_eclairage_central, #PB_Gadget_FrontColor, #Red)
Dessine_Eclaire_Fond(#Image)
Dessine_Eclaire_Fond(#Image1)
Dessine_Eclaire_Fond(#Image2)
Dessine_Eclaire_Fond(#Image3)
Mise_A_jour_Miniatures()
;- dégradé intérieur
Case 4 ; dessine un dégradé sur la sphère créant le contour plus foncé
SetGadgetColor(#Textgadget_eclairage_central, #PB_Gadget_FrontColor, $C0C0C0)
SetGadgetColor(#Textgadget_Contour, #PB_Gadget_FrontColor, #Red)
Dessine_Degrade_Fond(#image)
Dessine_Degrade_Fond(#image1)
Dessine_Degrade_Fond(#image2)
Dessine_Degrade_Fond(#image3)
Mise_A_jour_Miniatures()
;- fond des yeux
Case 5 ; dessine le fond des yeux avec dégradé linaire gris/blanc
SetGadgetColor(#Textgadget_Contour, #PB_Gadget_FrontColor, $C0C0C0)
SetGadgetColor(#Textgadget_FondOeuil, #PB_Gadget_FrontColor, #Red)
Dessine_FondOeuil(#image)
Dessine_FondOeuil(#image1)
Dessine_FondOeuil(#image2)
Dessine_FondOeuil(#image3)
Mise_A_jour_Miniatures()
Case 6 ;- contour des yeux
SetGadgetColor(#Textgadget_FondOeuil, #PB_Gadget_FrontColor, $C0C0C0)
SetGadgetColor(#Textgadget_ContourOeuil, #PB_Gadget_FrontColor, #Red)
Dessine_ContourOeuil(#image)
Dessine_ContourOeuil(#image1)
Dessine_ContourOeuil(#image2)
Dessine_ContourOeuil(#image3)
Mise_A_jour_Miniatures()
;- Pupilles noires
Case 7 ; création de la pupille des yeux en noir
SetGadgetColor(#Textgadget_ContourOeuil, #PB_Gadget_FrontColor, $C0C0C0)
SetGadgetColor(#Textgadget_Pupille, #PB_Gadget_FrontColor, #Red)
Dessine_Pupille(#image)
Dessine_Pupille(#image1)
Dessine_Pupille(#image2)
Dessine_Pupille(#image3)
Mise_A_jour_Miniatures()
;- reflet blanc sur la pupille des yeux
Case 8, 9 ; le reflet blanchâtre (en 2 temps)
SetGadgetColor(#Textgadget_Pupille, #PB_Gadget_FrontColor, $C0C0C0)
SetGadgetColor(#Textgadget_RefletPupille, #PB_Gadget_FrontColor, #Red)
Dessine_Reflet_Pupille(#Image)
Dessine_Reflet_Pupille(#Image1)
Dessine_Reflet_Pupille(#Image2)
Dessine_Reflet_Pupille(#Image3)
Mise_A_jour_Miniatures()
Case 10 ;- Les sourcils
SetGadgetColor(#Textgadget_RefletPupille, #PB_Gadget_FrontColor, $C0C0C0)
SetGadgetColor(#Textgadget_Sourcils, #PB_Gadget_FrontColor, #Red)
Dessine_Sourcils(#Image)
Dessine_Sourcils(#Image1)
Dessine_Sourcils(#Image2)
Dessine_Sourcils(#Image3)
Mise_A_jour_Miniatures()
;- Bouche
Case 11 ; dessine la bouche
SetGadgetColor(#Textgadget_Sourcils, #PB_Gadget_FrontColor, $C0C0C0)
SetGadgetColor(#Textgadget_Bouche, #PB_Gadget_FrontColor, #Red)
Dessine_Bouche(#Image)
Dessine_Bouche(#Image1)
Dessine_Bouche(#Image2)
Dessine_Bouche(#Image3)
Mise_A_jour_Miniatures()
;- Dents
Case 12 ; dessine les dents supérieures et inférieures
SetGadgetColor(#Textgadget_Bouche, #PB_Gadget_FrontColor, $C0C0C0)
SetGadgetColor(#Textgadget_Dents, #PB_Gadget_FrontColor, #Red)
Dessine_Dentition(#Image)
Dessine_Dentition(#Image1)
Dessine_Dentition(#Image2)
Dessine_Dentition(#Image3)
Mise_A_jour_Miniatures()
Case 13
SetGadgetColor(#Textgadget_Dents, #PB_Gadget_FrontColor, $C0C0C0)
Default
EndSelect
EndIf
Case #PB_Event_Gadget
EndSelect
ForEver
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
If *brush1 : GdipDeleteBrush(*brush1) : EndIf
If *Pen1 : GdipDeletePen(*Pen1) : EndIf
If *path : GdipDeletePath(*path) : EndIf
If *path1 : GdipDeletePath(*path1) : EndIf
If *pen1 : GdipDeletePen(*pen1) : EndIf
If *matrix : GdipDeleteMatrix(*matrix) : EndIf
If *gfx1 : GdipDeleteGraphics(*gfx1) : EndIf
If *token : GdiplusShutdown(*token) : EndIf
End