Rechercher dans ce blog

jeudi 30 décembre 2021

Progressbar Sonic Animé

 Voici comment realiser un progressbar Sonic animé.


vous pouvez changer les couleurs des murs et aussi drawborder.

Ma classes :

 Imports System.Drawing.Drawing2D
Imports System.IO

Public Class ProgressbarSonic : Inherits ProgressBar

    Private _BarColorSolidA As Color = Color.FromArgb(111, 37, 0)
    Public Property BarColorSolidA As Color
        Get
            Return _BarColorSolidA
        End Get
        Set(value As Color)
            If value = Color.Transparent Then
                Return
            Else
                _BarColorSolidA = value
                Me.Invalidate()
            End If
        End Set
    End Property

    Private _BarColorSolidB As Color = Color.FromArgb(255, 128, 0)
    Public Property BarColorSolidB As Color
        Get
            Return _BarColorSolidB
        End Get
        Set(value As Color)
            If value = Color.Transparent Then
                Return
            Else
                _BarColorSolidB = value
                Me.Invalidate()
            End If
        End Set
    End Property

    Private _ColorDraw As Color = Color.White
    Public Property ColorDraw As Color
        Get
            Return _ColorDraw
        End Get
        Set(value As Color)
            If value = Color.Transparent Then
                Return
            Else
                _ColorDraw = value
                Me.Invalidate()
            End If
        End Set
    End Property


    Private _Sonic As String = "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"
    Private SonicImage As Image = Nothing
    Private rect As New Rectangle
    Private Moving As Boolean = False
    Private Animating As Boolean = False
    Public Sub New()
        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint, True)
        Me.Size = New Size(400, 23)
        Me.SonicImage = CodeToGif(_Sonic)
    End Sub

    Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        rect = New Rectangle(0, 0, Me.Width, Me.Height)
        e.Graphics.DrawRectangle(New Pen(New SolidBrush(_ColorDraw)), New Rectangle(rect.X + 10, rect.Y, rect.Width - 25, rect.Height - 1))
        rect.Inflate(-2, -2)
        Dim progressWidht As Integer = CInt(((rect.Width - 24) / (Maximum - Minimum)) * Value)
        GetRectangle(e.Graphics, rect, progressWidht, _BarColorSolidA, _BarColorSolidB, 5)
        If SonicImage Is Nothing Then Return
        animateImage()
        ImageAnimator.UpdateFrames()
        e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        e.Graphics.DrawImage(SonicImage, progressWidht - CInt(SonicImage.Width - 24), rect.Height - CInt(SonicImage.Height - 1))
    End Sub

    Private Sub GetRectangle(g As Graphics, rect As Rectangle, Value As Integer, ColorA As Color, ColorB As Color, larg As Integer)
        For i As Integer = 0 To rect.Width
            For j As Integer = 0 To rect.Height
                If Math.IEEERemainder(i + j, 2) = 0 Then
                    g.FillRectangle(New SolidBrush(ColorA), New Rectangle(CInt(rect.X + 10) + i * larg, rect.Y + j * larg, Value - i * larg, rect.Height - j * larg))
                Else
                    g.FillRectangle(New SolidBrush(ColorB), New Rectangle(CInt(rect.X + 10) + i * larg, rect.Y + j * larg, Value - i * larg, rect.Height - j * larg))
                End If
            Next
        Next
    End Sub

    Private Sub animateImage()
        If Not Animating Then
            ImageAnimator.Animate(SonicImage, New EventHandler(AddressOf Me.OnFrameChanged))
            Animating = True
        End If
    End Sub

    Private Sub OnFrameChanged()
        Me.Invalidate()
    End Sub

    Private Function CodeToGif(code As String) As Image
        Dim _image As Image = Image.FromStream(New MemoryStream(Convert.FromBase64String(code)))
        Return _image
    End Function

    Protected Overrides Sub OnResize(ByVal e As EventArgs)
        MyBase.OnResize(e)
        If Me.Height <> 23 Then
            Me.Height = 23
        ElseIf Me.Width < 250 Then
            Me.Width = 250
        ElseIf Me.Width > 600 Then
            Me.Width = 600
        End If
    End Sub

    Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseDown(e)
        If rect.Contains(e.Location) OrElse e.Button = Windows.Forms.MouseButtons.Left Then
            Moving = True
        End If
    End Sub
    Protected Overrides Sub OnMouseup(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseUp(e)
        Moving = False
    End Sub
    Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
        If Moving AndAlso e.X > -2 AndAlso e.X < CInt(rect.Width + 2) Then
            Value = CInt((Maximum - Minimum) * (e.X / rect.Width))
        End If
        MyBase.OnMouseMove(e)
    End Sub

    Protected Overrides Sub OnMouseEnter(e As System.EventArgs)
        MyBase.OnMouseEnter(e)
        If Cursor.Equals(Cursors.Arrow) Then
            Me.Cursor = Cursors.Hand
        End If
    End Sub

    Protected Overrides Sub OnMouseLeave(e As System.EventArgs)
        MyBase.OnMouseLeave(e)
        If Cursor.Equals(Cursors.Hand) Then
            Me.Cursor = Cursors.Arrow
        End If
    End Sub

End Class

Aucun commentaire:

Enregistrer un commentaire