Advanced gdiplusX drawings : polygons

Published on by Yousfi Benameur


*this code draws polygons with gdiplusX and fill them
*all gdiplusX technics are used to do that goal.
*make sure you have the gdiplusX class and latest stable system.app
*the code asks you to point to gdiplusX class and system.app

*Begin code

publi m.yrep
m.yrep=addbs(justpath(sys(16,1)))

Do Locfile("system.app")
Set Classlib To Locfile("gdiplusX") AddI
  && hardcode  it in the code definitively

Publi yform
yform=Newobject("test08")
yform.Show
Release Classlib "gdiplusX"
Read Events
Return

Define Class test08 As Form
    Height = 714
    Width = 995
    ShowWindow = 2
    ShowTips = .T.
    AutoCenter = .T.
    Caption = "GdiPlusX samples   -Drawing polygons"
    KeyPreview = .T.
    WindowState = 2
    BackColor = Rgb(0,0,0)
    ycolor1 = 255
    ycolor2 = 1254
    nmode = 3
    nbr = 5
    ycolor0 = 0
    cas = 0
    ycli = 0
    yim=1
    Name = "Form1"

    Add Object imgcanvas2 As imgcanvas With ;
        Anchor = 15, ;
        Stretch = 2, ;
        Height = 672, ;
        Left = 0, ;
        Top = 0, ;
        Width = 997, ;
        Name = "Imgcanvas2"

    Add Object imgcanvas1 As imgcanvas With ;
        Anchor = 15, ;
        Stretch = 2, ;
        Height = 672, ;
        Left = 0, ;
        Top = 0, ;
        Width = 996, ;
        Name = "Imgcanvas1"

    Add Object command2 As CommandButton With ;
        Top = 686, ;
        Left = 110, ;
        Height = 27, ;
        Width = 106, ;
        Anchor = 768, ;
        Caption = "Swith  multi colors", ;
        ToolTipText = "acolor(5)=.color.brown", ;
        BackColor = Rgb(0,255,0), ;
        Name = "Command2"

    Add Object command1 As CommandButton With ;
        Top = 686, ;
        Left = 5, ;
        Height = 27, ;
        Width = 84, ;
        Anchor = 768, ;
        Caption = "Effects", ;
        ToolTipText = "ESC to stop play", ;
        BackColor = Rgb(128,0,64), ;
        Name = "Command1"

    Add Object timer1 As Timer With ;
        Top = 684, ;
        Left = 84, ;
        Height = 23, ;
        Width = 23, ;
        Enabled = .F., ;
        Interval = 250, ;
        Name = "Timer1"


    Add Object text1 As TextBox With ;
        FontBold = .T., ;
        Anchor = 768, ;
        Height = 25, ;
        Left = 216, ;
        SelectOnEntry = .T., ;
        ToolTipText = "Type an number<=80 (n branches)", ;
        Top = 686, ;
        Width = 37, ;
        BackColor = Rgb(255,255,0), ;
        Name = "Text1"

    Add Object command4 As CommandButton With ;
        Top = 686, ;
        Left = 397, ;
        Height = 27, ;
        Width = 142, ;
        Anchor = 768, ;
        Caption = "Swith colors Surrounds", ;
        ToolTipText = "acolor(5)=.color.brown", ;
        BackColor = Rgb(255,0,0), ;
        Name = "Command4"

    Add Object command5 As CommandButton With ;
        Top = 681, ;
        Left = 608, ;
        Height = 35, ;
        Width = 36, ;
        Anchor = 768, ;
        Picture = "c:\program files\microsoft visual foxpro 9\graphics\icons\misc\camera.ico", ;
        Caption = "", ;
        ToolTipText = "Capture  image+View", ;
        Name = "Command5"

    Add Object command6 As CommandButton With ;
        Top = 686, ;
        Left = 685, ;
        Height = 25, ;
        Width = 73, ;
        FontBold = .T., ;
        Anchor = 768, ;
        Caption = "Save", ;
        BackColor = Rgb(0,255,0), ;
        Name = "Command6"

    Procedure ypolygon
        Lparameters nb
        *,r,pr
        r=250
        pr=120   &&90

        Create Cursor ycoord (nx N(4,0),ny N(4,0))
        Set Safe On
        xc=0.5*Thisform.Width
        yc=1.1*Thisform.Height/2

        For i=0 To (2*Pi()) Step 2*Pi()/nb            &&-2*pi()/nb
            x=xc+r*Cos(i-Pi()/2)
            Y=yc+r*Sin(i-Pi()/2)
            Sele ycoord
            Appe Blan
            Repl nx With x,ny With Y
            x1=xc+pr*Cos(i-Pi()/2+Pi()/nb)
            y1=yc+pr*Sin(i-Pi()/2+Pi()/nb)

            Sele ycoord
            Appe Blan
            Repl nx With x1,ny With y1
        Endfor

        &&montage fichier polygon
        Sele  ycoord
        Count To xx For Not Deleted()
        Go Top
        Dimension  Mat0(xx,2)

        i=1
        v=""
        Do While Not Eof()
            If Not Deleted()
                Mat0(i,1)=nx
                Mat0(i,2)=ny
                v=v+"Mat0("+Allt(Str(i))+",1)="+Allt(Str(nx))+Chr(13)+"Mat0("+Allt(Str(i))+",2)="+Allt(Str(ny))+Chr(13)

                i=i+1
            Endi
            Skip
        Enddo
        vv="dimension Mat0("+Allt(Str(i-1))+",2)"+Chr(13) +v
        TEXT to myvar noshow
        <<vv>>
        ENDTEXT

    Endproc

    Procedure ypat
        With _Screen.System.Drawing
            pth = .Drawing2D.GraphicsPath.New()
            nn=Alen(Mat0)
            aa=""
            For i=1 To Alen(Mat0)-1  Step 2
                pth.AddLine(.Point.New(Mat0(i),Mat0(i+1)),.Point.New(Mat0(i+2),Mat0(i+3)) )
                aa=aa+Trans(".point.new("+Trans(Mat0(i))+ "," +Trans(Mat0(i+1))+ "),"  +".point.new("+Trans(Mat0(i))+ "," +Trans(Mat0(i+1))+")")+Chr(13)
                If i>nn-4
                    Exit
                Endi
            Endfor
            pth.closeFigure()
        Endwith

        Return pth
    Endproc

    Procedure yrandom
        Clear
        gnInférieur = 1
        gnSupérieur = 255
        nRed1=Int((gnSupérieur - gnInférieur + 1) * Rand( ) + gnInférieur)
        nGreen1=Int((gnSupérieur - gnInférieur + 1) * Rand( ) + gnInférieur)
        nBlue1=Int((gnSupérieur - gnInférieur + 1) * Rand( ) + gnInférieur)
        nRed2=Int((gnSupérieur - gnInférieur + 1) * Rand( ) + gnInférieur)
        nGreen2=Int((gnSupérieur - gnInférieur + 1) * Rand( ) + gnInférieur)
        nBlue2 =Int((gnSupérieur - gnInférieur + 1) * Rand( ) + gnInférieur)
        Thisform.ycolor1=Rgb(nRed1,nGreen1,nBlue1)
        Thisform.ycolor2=Rgb(nRed2,nGreen2,nBlue2)

        Thisform.nmode=Thisform.nmode+1

        If Thisform.nmode>3
            Thisform.nmode=1
        Endi
    Endproc

    Procedure Init
        Set Esca Off
        Thisform.SetAll("mousepointer",15,"commandbutton")

        Publi ii,pth,Mat0
        ii=0
        This.imgcanvas1.Left=This.Left
        This.imgcanvas1.Top=This.Top
        This.imgcanvas1.Width=This.Width
        This.imgcanvas1.Height=This.Height
        This.imgcanvas2.Visible=.T.


        This.imgcanvas2.Left=This.Left
        This.imgcanvas2.Top=This.Top
        This.imgcanvas2.Width=This.Width
        This.imgcanvas2.Height=This.Height
        This.imgcanvas1.Visible=.T.

        Thisform.ycolor0=0  &&.color.black"
        *thisform.ycolor1=".color.green"
        *thisform.ycolor2=".color.red"

        This.ycolor1=255
        This.ycolor2=Rgb(0,255,0)

        Thisform.nbr=5
    Endproc

    Procedure KeyPress
        Lparameters nKeyCode, nShiftAltCtrl
        If nKeyCode=27
            Thisform.timer1.Enabled=.F.
        Endi
    Endproc
    Procedure Destroy
        Clea Events
    Endproc

    Procedure imgcanvas2.beforedraw
        Local yPath As xfcGraphicsPath
        Local pgb As xfcPathGradientBrush
        Local logfx
        Local w,h
        *This.Clear()
        logfx=This.ogfx
        With _Screen.System.Drawing
            logfx.SmoothingMode = .Drawing2D.SmoothingMode.AntiAlias

            This.Clear(.Color.black)      &&fromRGB(thisform.ycolor0))
            Thisform.ypolygon(Thisform.nbr)
            *draw star
            gnInférieur = 1
            gnSupérieur = 10
            num=Int((gnSupérieur - gnInférieur + 1) * Rand( ) + gnInférieur)
            Do Case
                Case num=1
                    yloBrush=".Brushes.gold"
                Case num=2
                    yloBrush=".Brushes.blue"
                Case num=3
                    yloBrush=".Brushes.green"
                Case num=4
                    yloBrush=".Brushes.cyan"
                Case num=5
                    yloBrush=".Brushes.red"
                Case num=6
                    yloBrush=".Brushes.pink"
                Case num=7
                    yloBrush=".Brushes.yellow"
                Case num=8
                    yloBrush=".Brushes.white"
                Case num=9
                    yloBrush=".Brushes.gray"
                Case num=10
                    yloBrush=".Brushes.black"
            Endcase

            This.ogfx.FillPolygon(&yloBrush, @Mat0)
            Pen = .Pen.New(.Color.red, 4)
            This.ogfx.DrawPolygon(Pen, @Mat0)
            Pen.Dispose()

            Thisform.ypat()
            pgb=.Drawing2D.PathGradientBrush.New(pth)
            pgb.CenterColor=.Color.White
            pgb.SurroundColors=.Color.blue      &&fromRGB(thisform.ycolor1)
            bl=.Drawing2D.Blend.New()
            bl.Factors=_Screen.System.Single.newArray(1,0,1,0,1)
            bl.Positions= _Screen.System.Single.newArray(0,0.25,0.5,0.75,1)
            pgb.Blend=bl
            logfx.FillPath(pgb,pth)
            pgb.Dispose()

        Endwith
        Return


        *texte
        Local loFont As xfcFont
        Local loBrush As xfcLinearGradientBrush
        Local loRectangleF As xfcRectangleF
        Local loSizeF As xfcSizeF
        ystring="YOUSFI BENAMEUR NOV 27, 2008   GDIPLUSX under VFP9"
        ystring1="All VFP stars"
        loFont  = .Font.New("Arial Black",20,  .FontStyle.Bold)
        loFont1 = .Font.New("Batavia",42,  .FontStyle.Bold)

        loSizeF = logfx.MeasureString(ystring, loFont)
        loSizeF1 = logfx.MeasureString(ystring1, loFont1)

        loRectangleF =_Screen.System.Drawing.RectangleF.New(0,0,loSizeF.Width, loSizeF.Height)
        loRectangleF1=_Screen.System.Drawing.RectangleF.New(10,This.Height/10,loSizeF1.Width, loSizeF1.Height)

        loBrush = .Drawing2D.LinearGradientBrush.New(loRectangleF,;
            evaluate(Thisform.ycolor1), ;
            evaluate(Thisform.ycolor2),;
            thisform.nmode)
        loBrush1 = .Drawing2D.LinearGradientBrush.New(loRectangleF1,;
            evaluate(Thisform.ycolor2), ;
            evaluate(Thisform.ycolor1),;
            thisform.nmode)
        logfx.DrawString(ystring, loFont,loBrush, loRectangleF)
        logfx.DrawString(ystring1, loFont1,loBrush1, loRectangleF1)

        *endwith
        *return
    Endproc

    Procedure imgcanvas1.beforedraw
        Local yPath As xfcGraphicsPath
        Local pgb As xfcPathGradientBrush
        Local logfx
        Local w,h

        This.Clear()
        logfx=This.ogfx

        With _Screen.System.Drawing
            logfx.SmoothingMode = .Drawing2D.SmoothingMode.AntiAlias

            This.Clear(.Color.black)     &&fromRGB(thisform.ycolor0))
            Thisform.ypolygon(Thisform.nbr)
            Thisform.ypat()
            pgb=.Drawing2D.PathGradientBrush.New(pth)
            pgb.CenterColor=.Color.gold

            nbr=Thisform.nbr
            Dimension acolor(2*nbr)
            For i=1 To 2*nbr
                Thisform.yrandom()
                acolor(i)=.Color.green   &&.fromRGBthisform.ycolor1)
            Endfor

            For i=1 To 2*nbr
                pgb.SurroundColors(i)=acolor(i)
            Endfor

            bl=.Drawing2D.Blend.New()
            bl.Factors=_Screen.System.Single.newArray(1,0,1,0,1)
            bl.Positions= _Screen.System.Single.newArray(0,0.25,0.5,0.75,1)
            pgb.Blend=bl
            logfx.FillPath(pgb,pth)
            bl=Null
            pgb.Dispose()

        Endwith
        Return
    Endproc

    Procedure command2.Click
        gnInférieur = 5
        gnSupérieur = 80
        Thisform.nbr=Int((gnSupérieur - gnInférieur + 1) * Rand( ) + gnInférieur)

        Thisform.ycolor0=".color.black"
        Thisform.BackColor=0
        ii=ii+1
        If ii>10
            ii=1
        Endi

        Do Case
            Case ii=1
                Thisform.ycolor1=".color.red"
            Case ii=2
                Thisform.ycolor1=".color.green"
            Case ii=3
                Thisform.ycolor1=".color.blue"
            Case ii=4
                Thisform.ycolor1=".color.cyan"
            Case ii=5
                Thisform.ycolor1=".color.yellow"
            Case ii=6
                Thisform.ycolor1=".color.magenta"
            Case ii=7
                Thisform.ycolor1=".color.gold"
            Case ii=8
                Thisform.ycolor1=".color.gray"
            Case ii=9
                Thisform.ycolor1=".color.black"
            Case ii=10
                Thisform.ycolor1=".color.purple"
        Endcase

        Thisform.imgcanvas2.Visible=.T.
        Thisform.imgcanvas1.Visible=.F.
        Thisform.imgcanvas2.Draw()
        Thisform.yim=2
    Endproc

    Procedure command1.Click
        Thisform.timer1.Enabled=.T.
    Endproc

    Procedure timer1.Timer
        With Thisform
            .ycli=.ycli+1
            If .ycli>7
                .ycli=0
                This.Enabled=.F.
            Else
                Thisform.command2.Click
            Endi
        Endwith
    Endproc

    Procedure text1.Init
        This.Value=5
    Endproc

    Procedure text1.InteractiveChange
        If Between(This.Value,3,80)
            Thisform.nbr=This.Value
            Thisform.imgcanvas1.Draw()
            thisform.refresh
        Endi
    Endproc


    Procedure command4.Click
        Thisform.cas=2
        &&random color
        *thisform.autor=1

        gnInférieur = 5
        gnSupérieur = 80
        Thisform.nbr=Int((gnSupérieur - gnInférieur + 1) * Rand( ) + gnInférieur)

        Thisform.ycolor0=".color.black"
        Thisform.BackColor=0
        Thisform.yrandom()

        Thisform.imgcanvas1.Visible=.T.
        Thisform.imgcanvas2.Visible=.F.
        Thisform.imgcanvas1.Draw()
        Thisform.yim=1
    Endproc

    Procedure command5.Click
        Do Case
            Case Thisform.yim=1
                Thisform.imgcanvas1.obmp.toclipboard()
            Case Thisform.yim=2
                Thisform.imgcanvas2.obmp.toclipboard()
        Endcase

        Run/n3 mspaint
        Inkey(2)
        loShell=Createobject("wscript.shell")
        loShell.sendKeys("^{v}")

    Endproc

    Procedure command6.Click
        *save contents as PNG in source folder
        *save contents as PNG in source folder
        Thisform.Refresh

        Local m.lcdest
        m.lcdest=m.yrep+"ycap"+Sys(2015)+".png"


        With _Screen.System.Drawing
            Do Case
                Case Thisform.yim=1
                    Thisform.imgcanvas1.obmp.Save(m.lcdest,.imaging.imageformat.PNG)
                Case Thisform.yim=2
                    Thisform.imgcanvas2.obmp.Save(m.lcdest,.imaging.imageformat.PNG)
            Endcase

            Messagebox(m.lcdest,0+32+4096,"saved",500)
        Endwith
    Endproc

Enddefine
*

*End code

 

the second image=application screenshot-(some green color in the center of drawing went from centercolor function).
the second image=application screenshot-(some green color in the center of drawing went from centercolor function).
the second image=application screenshot-(some green color in the center of drawing went from centercolor function).
the second image=application screenshot-(some green color in the center of drawing went from centercolor function).
the second image=application screenshot-(some green color in the center of drawing went from centercolor function).
the second image=application screenshot-(some green color in the center of drawing went from centercolor function).
the second image=application screenshot-(some green color in the center of drawing went from centercolor function).

the second image=application screenshot-(some green color in the center of drawing went from centercolor function).

To be informed of the latest articles, subscribe:
Comment on this post