Class CircularPb
    Inherits Control
 
    Public Property Interval As Integer = 50
    Public Property StartAngle As Single = 30
    Public Property PenColor As Color = Color.FromArgb(58, 58, 58)
    Private Pen As New Pen(PenColor, 2)
    Private Timer As New Timers.Timer(Interval)
    Private Spokes As List(Of Spoke) = Nothing
    Private _InnerRadius As Integer = 4
    Private _OuterRadius As Integer = 8
    Private _AlphaStartValue As Integer = 255
    Private _SpokesCount As Integer = 12
    Private _AlphaChange As Integer = 0
    Private _AlphaLowerLimit As Integer = 15
    Private _AngleIncrement As Single = 0
 
    Public Sub New()
        Me.DoubleBuffered = True
        Me.Size = New Size(65, 65)
        Pen.EndCap = Drawing2D.LineCap.Round
        Pen.StartCap = Drawing2D.LineCap.Round
        AddHandler Timer.Elapsed, AddressOf OnTimerElapsed
        'Start()
    End Sub
 
    Protected Overrides Sub OnSizeChanged(e As EventArgs)
        MyBase.OnSizeChanged(e)
        SpokesPoints()
    End Sub
 
    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        MyBase.OnPaintBackground(e)
        Dim G As Graphics = e.Graphics
        G.Clear(BackColor)
        G.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        G.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
        Dim alpha As Integer = _AlphaStartValue
        For i As Integer = 0 To _SpokesCount - 1
            Pen.Color = Color.FromArgb(alpha, PenColor)
            G.DrawLine(Pen, Spokes(i).StartPoint, Spokes(i).EndPoint)
            alpha -= _AlphaChange
            If alpha < _AlphaLowerLimit Then alpha = 255 - _AlphaChange
        Next
    End Sub
 
    Public Sub Start()
        Timer.Enabled = True
    End Sub
 
    Public Sub [Stop]()
        Timer.Enabled = False
    End Sub
 
    Private Sub OnTimerElapsed(sender As Object, e As Timers.ElapsedEventArgs)
        StartAngle += _AngleIncrement
        If StartAngle >= 360 Then StartAngle = 0
        _AlphaStartValue -= _AlphaChange
        If _AlphaStartValue < _AlphaLowerLimit Then _AlphaStartValue = 255 - _AlphaChange
        Invalidate()
    End Sub
 
    Private Structure Spoke
        Public StartPoint As PointF
        Public EndPoint As PointF
        Public Sub New(pt1 As PointF, pt2 As PointF)
            StartPoint = pt1
            EndPoint = pt2
        End Sub
    End Structure
 
    Private Sub SpokesPoints()
        Spokes = New List(Of Spoke)
        _AngleIncrement = (360 / CSng(_SpokesCount))
        _AlphaChange = CInt((255 - _AlphaLowerLimit) / _SpokesCount)
        Dim width As Integer = If((Me.Width < Me.Height), Me.Width, Me.Height)
        Dim _CentrePt = New PointF(Me.Width / 2, Me.Height / 2)
        Pen.Width = CInt(width / 15)
        If Pen.Width < 2 Then Pen.Width = 2
        _InnerRadius = CInt(width * 0.175F)
        _OuterRadius = CInt(width * 0.3125F)
        Dim angle As Single = 0
        For i As Integer = 0 To _SpokesCount - 1
            Dim pt1 As New PointF(_InnerRadius * CSng(Math.Cos((Math.PI / CDbl(180)) * angle)), _InnerRadius * CSng(Math.Sin((Math.PI / CDbl(180)) * angle)))
            Dim pt2 As New PointF(_OuterRadius * CSng(Math.Cos((Math.PI / CDbl(180)) * angle)), _OuterRadius * CSng(Math.Sin((Math.PI / CDbl(180)) * angle)))
            pt1.X += _CentrePt.X
            pt1.Y += _CentrePt.Y
            pt2.X += _CentrePt.X
            pt2.Y += _CentrePt.Y
            Spokes.Add(New Spoke(pt1, pt2))
            angle -= _AngleIncrement
        Next
    End Sub
End Class