GDIPLUS.DLL

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

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


Image

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
Dernière modification par Anonyme2 le sam. 06/janv./2007 18:53, modifié 1 fois.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

excellent denis. c'est très joli.
les smileys et le texte antialiasé du cadeau de noel est du plus bel effet :P
Image
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Y-a-t-il un codeur qui a installé vista ?

Si oui, peut-il passer passer un coup la dll GDIplus de vista dans la moulinette de dll viewer pour me donner le nombre de fonction contenu dans la dll

Merci d'avance
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est super Denis, bon boulot. :D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Ca fait 2 semaines que je travaille sur les métafichiers avec les fonctions GDI+ et je n'ai pas beaucoup avancé.

Les vieux formats WMf et wmf placeable me causent quelques soucis.

Je n'ai trouvé aucun fichier au format wmf (les vrais, surement avec le numéro de version valant $100). Je n'ai en fait que des wmf placeable qui sont bien supporté par GDI+ (d'ailleurs word et excel utilisent pas mal ce format)

Les wmf placeable on un pre-header de 22 octets avant le header du fichier. j'ai converti plusieurs fichiers wmf placeable avec un viel outil MS et également en ré-écrivant le fichier à partir du 23ème octet.

En ouvrant ces fichiers, la version du métafichier retourné (du header) est l'identifiant des fichiers emf standart.

Je recherche donc des fichiers wmf (16 bits) directement pris depuis windows 3.0 pour faire mes tests (et essayer de comprendre) .Si l'un d'entre vous possède encore cet OS, je serais preneur de plusieurs fichier wmf présents sur le disque.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

je viens de faire une petite recherche et j'en ai trouvé quelques uns (environ 1500), les plus anciens remontent à 1998. je ne sais pas s'ils correspondent à ce que tu cherches, mais si ça t'intéresse...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

J'en avai trouvé en faisant des recherches là dessus... Je vais essayer de retrouver ca mais en gros c'était un tuto pour convertir du wmf en wmf placeable (et vice et versa) avec le code en C et la petite appli. Le tuto s'accompagnait de petits fichiers wmf d'exemple... Donc je vais essayer de te retrouver ca

Dri
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Jacobus a écrit :je viens de faire une petite recherche et j'en ai trouvé quelques uns (environ 1500), les plus anciens remontent à 1998. je ne sais pas s'ils correspondent à ce que tu cherches, mais si ça t'intéresse...
@Jacobus
Merci Jacobus,

je peux en prendre quelques uns mais je pense qu'ils sont au format placeable

@Dri
j'ai du lire presque tout ce que j'ai trouvé et les exemples de conversion également (j'utilise d'ailleurs un convertisseur MS avec le code source). Je pense que depuis la plateforme 32 bits, les wmf sont convertis en 32 bits (c'est ce qu'il me semble avoir lu) puisqu'ils faut utiliser les nouvelles API d'ou leurs formats wmf donnant une version emf (c'est ce que je pense).
J'ai besoin d'anciens wmf, pas de code de conversion car ma plateforme est 32 bits.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Dri,

voici un code de tests. SI tu crois avoir des fichiers wmf standarts, ouvres-en un et lis dans la listicon le type de fichier retourné. Le thread utilisé ne l'est que pour ne pas avoir plusieurs messagerequester qui s'ouvrent en cas d'échec des API

Code : Tout sélectionner

XIncludeFile "..\..\..\gdiplus.pbi"

EnableExplicit


Structure Erreur
    NumErreur.l ; le numéro de l'erreur passée pour l'affichage
    GdipErreur.l ; le numéro de l'erreur retournée par la fonction GDI+
EndStructure


#MainWindow = 0
#TextGadget = 0
#ListIconGadget = 1
#Titre = "GdiPlus 1.0 - GdipGetMetafileHeaderFromFile"
CompilerIf Defined(LVM_GETHEADER, #PB_Constant) = #False
   #LVM_GETHEADER = #LVM_FIRST + 31
CompilerEndIf

Define .l
Global Fichier.s, erreur.l = #False, thread.l, MessageEffacer.l = #False, Msg.Erreur, HeaderID.l


Procedure.l IsMetaFile(*rc_metafile.Rect)
    ; retourne #true si le métafichier est au format emf/wmf, sinon #false
    ; retourne #False si la fonction GDI+ échoue
    ; rempli la variable Rect passée en paramètre avec les dimensions du métafichier
    ; si la largeur ou la hauteur dépasse 200 pixels, l'image est réduite pour que la plus grande
    ; dimensions soit de 200, l'autre étant réduite en gardant la proportionalité
    ; si la fonction de lecture du header du métafichier échoue, la variable est remplie avec les
    ; dimesnsions de la fenêtre
    ; rempli la listicongadget avec les infos du métafichuier
    
    Protected retour.l = #False, Localheader.MetafileHeader, MetFileType.s, ratio_H.f, ratio_V.f, EMF.l = #False
    
    If GdipGetMetafileHeaderFromFile(Fichier, @Localheader) = #Ok
        Select Localheader\Type
            Case #MetafileTypeWmf
                MetFileType = "Format wmf standart"
                retour = #True
                
            Case #MetafileTypeWmfplaceable
                MetFileType = "Format wmf placeable"
                retour = #True
                
            Case #MetafileTypeEmf
                MetFileType = "Format emf standart (GDI)"
                EMF = #True
                retour = #True
                
            Case #MetafileTypeEmfPlusonly
                MetFileType = "Format emf + only"
                EMF = #True
                retour = #True
                
            Case #MetafileTypeEmfplusdual
                MetFileType = "Format emf dual"
                EMF = #True
                retour = #True
                
            Default
                MetFileType = "Format non wmf"
                retour = #False
                
        EndSelect
        
        
        If retour
            If Not(CountGadgetItems(#ListIconGadget))
                AddGadgetItem(#ListIconGadget, -1, "Type de métafichier" + Chr(10) + MetFileType)
                AddGadgetItem(#ListIconGadget, -1, "Taille du métafichier en octets" + Chr(10) + Str(Localheader\Size))
                AddGadgetItem(#ListIconGadget, -1, "Version du métafichier" + Chr(10) + "$" + Hex(Localheader\Version))
                If EMF
                   AddGadgetItem(#ListIconGadget, -1, "EmfPlusFlags" + Chr(10) + Str(Localheader\EmfPlusFlags))
                EndIf
                AddGadgetItem(#ListIconGadget, -1, "Résolution horizontale en points par pouce" + Chr(10) + StrF(Localheader\DpiX))
                AddGadgetItem(#ListIconGadget, -1, "Résolution verticale en points par pouce" + Chr(10) + StrF(Localheader\DpiY))
                AddGadgetItem(#ListIconGadget, -1, "Coordonnée X de l'image en unité de périphérique" + Chr(10) + Str(Localheader\X))
                AddGadgetItem(#ListIconGadget, -1, "Coordonnée Y de l'image en unité de périphérique" + Chr(10) + Str(Localheader\Y))
                AddGadgetItem(#ListIconGadget, -1, "Largeur de l'image en pixels" + Chr(10) + Str(Localheader\Width))
                AddGadgetItem(#ListIconGadget, -1, "hauteur de l'image en pixels" + Chr(10) + Str(Localheader\Height))
                AddGadgetItem(#ListIconGadget, -1, "Résolution horizontale logique (points/pouce) de l'image" + Chr(10) + Str(Localheader\LogicalDpiX))
                AddGadgetItem(#ListIconGadget, -1, "Résolution veticale logique (points/pouce)" + Chr(10) + Str(Localheader\LogicalDpiY))
            EndIf
            *rc_metafile\left = 0
            *rc_metafile\top = 0
            If (Localheader\width > 200) Or (Localheader\height > 200)
                ; calcul du meilleur ratio par rapport à un carré de 200x200
                ratio_H = Localheader\width / 200
                ratio_V = Localheader\height / 200
                If ratio_H > ratio_V
                    *rc_metafile\right = Round(Localheader\width / ratio_H, 1)
                    *rc_metafile\bottom = Round(Localheader\height / ratio_H, 1)
                Else
                    *rc_metafile\right = Round(Localheader\width / ratio_V, 1)
                    *rc_metafile\bottom = Round(Localheader\height / ratio_V, 1)
                EndIf
            Else
                *rc_metafile\right = Localheader\width
                *rc_metafile\bottom = Localheader\height
            EndIf
            
        Else
            *rc_metafile\right = 200
            *rc_metafile\bottom = 200
        EndIf
        
        SetWindowTitle(#MainWindow, #Titre + "  - " + MetFileType)
    EndIf
    ProcedureReturn retour
EndProcedure


Procedure AfficheMessage(*argument.Erreur)
    ; argument est l'adresse de la variable permettant d'afficher l'erreur appelé par la callback
    
    Select *argument\NumErreur
        Case 1
            MessageRequester("Erreur", "La fonction GdipCreateMetafileFromFile a échouée" + Chr(10) + "et a retournée l'erreur " + Str(*argument\GdipErreur), 16)
            MessageEffacer = #True
            
        Case 2
            MessageRequester("Erreur", "Le fichier n'est pas au format emf/wmf", 16)
            MessageEffacer = #True
            
      EndSelect
EndProcedure



Procedure SetErreur_Thread(NumErreur.l, GdipErreur)
    ; crée un Thread gérant la fenêtre d'erreur si aucun thread n'existe
    If Thread
        If Not(IsThread(Thread))
            Thread = 0
        EndIf
    EndIf
    
    If IsThread(Thread)
        If MessageEffacer = #True
            KillThread(thread)
            Thread = 0
        EndIf
    Else
        Msg\NumErreur = NumErreur
        Msg\GdipErreur = GdipErreur
        Thread = CreateThread(@AfficheMessage(), @Msg)
        erreur = #True
    EndIf
EndProcedure


Procedure myCallback(window, message, wParam, lParam)
    Protected dc.l, ps.PAINTSTRUCT, status.l, rc.Rect
    Protected *Localtoken, *Localgfx, *metafileSource
    Protected wmfPlaceableFileHeader.WmfPlaceableFileHeader
    
    Select message
        Case #WM_PAINT
            If erreur = #False
                dc = BeginPaint_(window, @ps)
                If dc
                    ; initialisation de Gdi+
                    *Localtoken = Gdiplus_New()
                    ; on vérifie que l'initialisation est Ok
                    If *Localtoken
                        ; création du graphique d'affichage associé au DC
                        If GdipCreateFromHDC(dc, @*Localgfx) = #Ok
                            ; création de l'objet metafile depuis un fichier wmf existant
                            status = GdipCreateMetafileFromFile(Fichier, @*metafileSource)
                            If Not(status = #Ok) And Not(erreur)
                                SetErreur_Thread(1, status)
                            Else
                                ; teste le type (emf/wmf ou non)
                                If IsMetaFile(@rc)
                                    ; dessine l'image à partir du point 0/0
                                    GdipDrawImageRectI(*Localgfx, *metafileSource, rc\left, rc\top, rc\right, rc\bottom)
                                    GdipDeleteGraphics(*Localgfx) : *Localgfx = 0
                                Else
                                    SetErreur_Thread(2, -1)
                                EndIf
                            EndIf
                            GdipDisposeImage(*metafileSource)
                        EndIf
                        If *Localgfx : GdipDeleteGraphics(*Localgfx) : EndIf
                    EndIf
                    GdiplusShutdown(*Localtoken)
                EndIf
                EndPaint_(window, @ps)
            EndIf
    EndSelect
    ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure



Fichier = ""
Fichier = OpenFileRequester("Sélectionner le métafichier au format emf/wmf", "../Images/", "métafichier (emf/wmf)|*emf;*wmf", 0)
If Fichier = ""
    MessageRequester("Info", "Aucun fichier sélectionné    " + Chr(10) + "L'application va se terminer", 16)
    End
EndIf


If OpenWindow(#MainWindow, 0, 0, 780, 380, #Titre, #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(#MainWindow))
        ListIconGadget(#ListIconGadget, 215, 10, WindowWidth(#MainWindow) - 225, WindowHeight(#MainWindow) - 20, "Métafichier : " + GetFilePart(fichier), ((WindowWidth(#MainWindow) - 230) / 2) +53, #PB_ListIcon_GridLines)
        AddGadgetColumn(#ListIconGadget, 1, "Valeur", ((WindowWidth(#MainWindow) - 230) / 2) - 68)
        HeaderID = SendMessage_(GadgetID(#ListIconGadget), #LVM_GETHEADER, 0, 0)
        SendMessage_(HeaderID,#WM_SETFONT,LoadFont(0, "ARIAL", 10, #PB_Font_Bold),0)
        SetWindowCallback(@myCallback())
        
        ; boucle
        Repeat
            If erreur And MessageEffacer = #True
                Break
            EndIf
        Until WaitWindowEvent(#MainWindow) = #PB_Event_CloseWindow
        
        If Thread And IsThread(Thread)
            KillThread(thread)
        EndIf
    EndIf
EndIf
End
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Denis, tu peux télécharger le dossier complet sur PBSofts, il contient deux dossiers totalisant environ 1300 WMF, je ne sais s'ils correspondent au format que tu veux, à voir.

Télécharger ici >> Page Design&Dev de PurebasicSoftwares

Tu n'es pas obligé de t'inscrire... :wink:
[/url]
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Merci Jacobus,
je vais aller voir. Vu le nombre de fichiers, il doit s'agir des clipart d'office. J'ai remis en route un vieux portable qui tourne sous win95 et j'ai récupéré une quantité de wmf presque égale à la tienne, sous 95 ils sont déjà au format wmf placeable alors sous 98 ...

:D
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Jacobus,
J'ai une erreur 404 en essayant de télécharger le fichier.
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

:? désolé, je me suis planté d'une petite lettre dans le lien.
C'est rectifié et ça fonctionne.
Oui en effet, la plupart sont d'office.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je viens de passer le cap des 400 fonctions (avec l'aide d'Erix14), il en reste environ 210

Reste en gros à faire :

Les régions
Les Font
Les FontFamily
Les cached bitmap
Les notifications
Les Pathiterator
Les string format
Les graphics
Les customLinecap (il reste 3 fonctions qui me causent des problèmes)
Les images (Erix14 est dessus)

J'ai passé beaucoup beaucoup de temps sur les métafichiers (metafile).

Je pense terminer la première version fin mai.

Le Chm fait presque 2 Mo. Il en fera 3 lorsqu'il sera fini.

l'arborescence est celle-ci

Image
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

:D Merci Denis, de te donner autant de mal pour nous tous.
J'ai hate de voir ça et de pouvoir tester toutes les possibilités de ce GDI+ en toute connaissance de cause.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre