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