Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0367: Variable ProgressBar

 von 

Über den Tipp  

Dieser Tippvorschlag wird übernommen.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Grafik
  • Sonstiges
  • Steuerelemente

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
Usercontrol, Progressbar, Zeichnen, DoubleBuffer

Der Vorschlag wurde erstellt am: 09.05.2009 01:31.
Die letzte Aktualisierung erfolgte am 21.03.2016 14:18.

Zurück zur Übersicht

Beschreibung  

Eine etwas aufgebohrte ProgressBar. Kann vertikal oder horizontal angezeigt werden. Ermöglicht das Anzeigen des Durchschnittswertes. Farben können verändert werden. Einfach mal anuggn :-)

Schwierigkeitsgrad

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download des Beispielprojektes [14,83 KB]

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' ------ Anfang Projektdatei VariableProgressBar.vbproj ------
' ------------------ Anfang Datei Form1.vb  ------------------
Public Class Form1

    ''' <summary>
    ''' Festlegen, ob das Demo läuft.
    ''' </summary>
    Private _isRunning As Boolean = False

    Public Property isRunning() As Boolean
        Get
            Return _isRunning

        End Get

        Set(ByVal value As Boolean)
            _isRunning = value

            SetControls(value)

        End Set

    End Property

    ''' <summary>
    ''' Werte für das Demo.
    ''' </summary>
    Private _minValue As Integer
    Private _maxValue As Integer

    ''' <summary>
    ''' Startwerte festlegen.
    ''' </summary>
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load

        Me.cbDrawAverage.Checked = Me.vProgressBar.drawAverageRectangle
        Me.cbDrawBorder.Checked = Me.vProgressBar.drawBorder
        Me.cbDrawFilled.Checked = Me.vProgressBar.drawValueFilled
        Me.cbDrawVertical.Checked = Me.vProgressBar.drawVertical
        Me.lblMax.Text = Me.vProgressBar.maximumValue.ToString()
        Me.isRunning = False

    End Sub

    ''' <summary>
    ''' Zum Ändern des Verhaltens der ProgressBar.
    ''' </summary>
    Private Sub cbDrawVertical_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
        cbDrawAverage.Click

        Me.vProgressBar.drawAverageRectangle = cbDrawAverage.Checked

    End Sub

    Private Sub cbDrawBorder_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
        cbDrawBorder.Click

        Me.vProgressBar.drawBorder = cbDrawBorder.Checked

    End Sub

    Private Sub cbDrawFilled_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
        cbDrawFilled.Click

        Me.vProgressBar.drawValueFilled = cbDrawFilled.Checked

    End Sub

    Private Sub cbDrawVertical_Click_1(ByVal sender As Object, ByVal e As EventArgs) Handles _
        cbDrawVertical.Click

        Me.vProgressBar.drawVertical = cbDrawVertical.Checked

    End Sub

    ''' <summary>
    ''' Farben ändern.
    ''' </summary>
    Private Sub btnColorAverage_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
        btnColorAverage.Click

        If cD.ShowDialog = Windows.Forms.DialogResult.OK Then
            Me.vProgressBar.colorAverage = Color.FromArgb(cD.Color.ToArgb())
        End If

    End Sub

    Private Sub btnColorBorder_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
        btnColorBorder.Click

        If cD.ShowDialog = Windows.Forms.DialogResult.OK Then
            Me.vProgressBar.colorBorder = Color.FromArgb(cD.Color.ToArgb())
        End If

    End Sub

    Private Sub btnColorValue_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
        btnColorValue.Click

        If cD.ShowDialog = Windows.Forms.DialogResult.OK Then
            Me.vProgressBar.colorValue = Color.FromArgb(cD.Color.ToArgb())
        End If

    End Sub

    ''' <summary>
    ''' Demo-Controls ein und ausschalten.
    ''' </summary>
    Private Sub SetControls(ByVal b As Boolean)

        Me.tbMax.Enabled = Not b
        Me.tbMin.Enabled = Not b

        If b Then
            btnStartStop.Text = "Stop"

            t.Start()

        Else

            btnStartStop.Text = "Start"

            t.Stop()
        End If

    End Sub

    ''' <summary>
    ''' Demo starten bzw. stoppen.
    ''' </summary>
    Private Sub btnStartStop_Click(ByVal sender As Object, ByVal e As EventArgs) Handles _
        btnStartStop.Click

        If Me.isRunning Then
            Me.isRunning = False

            Me.vProgressBar.Reset()
            Me.lblMax.Text = vProgressBar.maximumValue.ToString()
            Me.lblValue.Text = ""
            Me.lblAvg.Text = ""

        Else

            Me.isRunning = True

            If Not IsNumeric(Me.tbMin.Text) Or Not IsNumeric(Me.tbMax.Text) Then _
                MessageBox.Show( "Bitte nur Zahlen eingeben") : Me.tbMin.Focus() : Exit Sub

            _minValue = CInt(Me.tbMin.Text)
            _maxValue = CInt(Me.tbMax.Text)
        End If

    End Sub

    ''' <summary>
    ''' Demo.
    ''' </summary>
    Private Sub t_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles t.Tick

        Dim rnd As New Random(Now.Millisecond)
        Dim value As Integer = CInt(rnd.Next(_minValue, _maxValue))

        Me.vProgressBar.AddValue(value)
        Me.lblMax.Text = vProgressBar.maximumValue.ToString("N0")
        Me.lblValue.Text = value.ToString("N0")
        Me.lblAvg.Text = vProgressBar.averageValue.ToString("N0")

    End Sub

End Class

' ------------------- Ende Datei Form1.vb  -------------------
' -------------- Anfang Datei ucProgressBar.vb  --------------
Imports System.ComponentModel

Public Class ucProgressBar

    Inherits UserControl
    ''' <summary>
    ''' Farbe für die Umrandung.
    ''' </summary>
    Private _colorBorder As Color = Color.Blue

    <Browsable(True)> Public Property colorBorder() As Color
        Get
            Return _colorBorder

        End Get

        Set(ByVal value As Color)
            _colorBorder = value

            _borderPen = New Pen(value)

            Me.Invalidate()

        End Set

    End Property

    ''' <summary>
    ''' Farbe für den aktuellen Wert.
    ''' </summary>
    Private _colorValue As Color = Color.Orange

    <Browsable(True)> Public Property colorValue() As Color
        Get
            Return _colorValue

        End Get

        Set(ByVal value As Color)
            _colorValue = value

            _valueBrush = New SolidBrush(value)
            _valuePen = New Pen(value)

            Me.Invalidate()

        End Set

    End Property

    ''' <summary>
    ''' Farbe für das Durchschnitts-Rechteck.
    ''' </summary>
    Private _colorAverageRectangle As Color = Color.Green

    <Browsable(True)> Public Property colorAverage() As Color
        Get
            Return _colorAverageRectangle

        End Get

        Set(ByVal value As Color)
            _colorAverageRectangle = value

            _averagePen = New Pen(value)

            Me.Invalidate()

        End Set

    End Property

    ''' <summary>
    ''' Umrandung zeichnen?
    ''' </summary>
    Private _drawBorder As Boolean = True

    <Browsable(True)> Public Property drawBorder() As Boolean
        Get
            Return _drawBorder

        End Get

        Set(ByVal value As Boolean)
            _drawBorder = value

            Me.Invalidate()

        End Set

    End Property

    ''' <summary>
    ''' Wert gefüllt zeichnen?
    ''' </summary>
    Private _drawValueFilled As Boolean = True

    <Browsable(True)> Public Property drawValueFilled() As Boolean
        Get
            Return _drawValueFilled

        End Get

        Set(ByVal value As Boolean)
            _drawValueFilled = value

            Me.Invalidate()

        End Set

    End Property

    ''' <summary>
    ''' Vertikal zeichnen?
    ''' </summary>
    Private _drawVertical As Boolean = False

    <Browsable(True)> Public Property drawVertical() As Boolean
        Get
            Return _drawVertical

        End Get

        Set(ByVal value As Boolean)
            _drawVertical = value

            If value Then
                SetVertical()

            Else

                SetHorizontal()
            End If

            Me.Invalidate()

        End Set

    End Property

    ''' <summary>
    ''' Der Maximumwert der ProgressBar.
    ''' </summary>
    Private _maximumValue As Single = 100

    <Browsable(True)> Public Property maximumValue() As Single
        Get
            Return _maximumValue

        End Get

        Set(ByVal value As Single)
            _maximumValue = value

            Me.Invalidate()

        End Set

    End Property

    ''' <summary>
    ''' Durchschnitts-Rechteck zeichnen?
    ''' </summary>
    Private _drawAverageRectangle As Boolean = True

    <Browsable(True)> Public Property drawAverageRectangle() As Boolean
        Get
            Return _drawAverageRectangle

        End Get

        Set(ByVal value As Boolean)
            _drawAverageRectangle = value

            Me.Invalidate()

        End Set

    End Property

    ''' <summary>
    ''' Berechnung des Durchschnittswerts.
    ''' </summary>
    Public ReadOnly Property averageValue() As Single
        Get

            If _lstValues.Count = 0 Then
                Return 0

            Else

                Return Aggregate i In _lstValues Into Average()
            End If

        End Get

    End Property

    ''' <summary>
    ''' die Pens bzw. Brushes zum Zeichnen der Rechtecke.
    ''' </summary>
    Private _borderPen As Pen
    Private _valuePen As Pen
    Private _valueBrush As SolidBrush
    Private _averagePen As Pen
    Private _lstValues As New List(Of Single)

    ''' <summary>
    ''' Startwerte.
    ''' </summary>
    Public Sub New()

        InitializeComponent()
        EnableDoubleBuffering()

        _borderPen = New Pen(Me.colorBorder)
        _valuePen = New Pen(Me.colorValue)
        _valueBrush = New SolidBrush(Me.colorValue)
        _averagePen = New Pen(Me.colorAverage)

    End Sub

    ''' <summary>
    ''' Neuen Wert hinzufügen.
    ''' </summary>
    Public Sub AddValue(ByVal value As Single)

        If value > Me.maximumValue Then Me.maximumValue = value

        _lstValues.Add(value)

        Me.Invalidate()

    End Sub

    ''' <summary>
    ''' Zurück auf Standart.
    ''' </summary>
    Public Sub Reset()

        _lstValues.Clear()

        Me.maximumValue = 100

    End Sub

    ''' <summary>
    ''' Hier wird die ProgressBar gezeichnet.
    ''' </summary>
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        ' Grafikobjekt.
        Dim g As Graphics = e.Graphics

        ' Variable für den zuletzt hinzugefügten Wert.
        Dim lastValue As Single

        ' Durchschnittswert holen.
        Dim average As Single = Me.averageValue

        ' Kantenglättung.
        g.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias

        ' Wenn keine Werte vorhanden sind, nichts zeichnen.
        If _lstValues.Count = 0 Then
            lastValue = 0

        Else

            ' Ansonsten den letzten Wert holen.
            lastValue = _lstValues(_lstValues.Count - 1)
        End If

        ' 2 Rechtecke. 1x akuteller Wert, 1x Durchschnitt.
        Dim vR As Rectangle = GetValueRectangle(lastValue, 1)
        Dim aR As Rectangle = GetValueRectangle(average, 2)

        ' Objekte zeichnen.
        If Me.drawAverageRectangle Then
            If Me.drawValueFilled Then
                g.FillRectangle(_valueBrush, vR)

            Else

                g.DrawRectangle(_valuePen, vR)
            End If

            g.DrawRectangle(_averagePen, aR)

        Else

            If Me.drawValueFilled Then
                g.FillRectangle(_valueBrush, vR)

            Else

                g.DrawRectangle(_valuePen, vR)
            End If
        End If

        If Me.drawBorder Then
            g.DrawRectangle(_borderPen, GetBorderRectangle())
        End If

    End Sub

    ''' <summary>
    ''' Verhältnis akuteller Wert zum Maximum berechnen.
    ''' </summary>
    ''' <param name="value">Aktueller Wert.</param>
    ''' <param name="offset">Zum Einrücken des Rechtecks, da es sonst übermalt wird.</param>
    Private Function GetValueRectangle(ByVal value As Single, ByVal offset As Integer) As Rectangle

        Dim r As Rectangle = Nothing

        ' Rechteck berechnen.
        If Me.drawVertical Then

            Dim rV As Single = GetRelativeValue(value)

            r = New Rectangle With {.X = 0 + offset, .Y = CInt(Me.Height - rV + offset), _
                .Width = Me.Width - offset - offset - 1, .Height = CInt(rV - offset - offset _
                - 1)}

        Else

            r = New Rectangle With {.X = 0 + offset, .Y = 0 + offset, .Width = CInt( _
                GetRelativeValue(value) - offset - offset - 1), .Height = Me.Height - offset _
                - offset - 1}

        End If

        Return r

    End Function

    ''' <summary>
    ''' Das Rechteck für die Umrandung.
    ''' </summary>
    Private Function GetBorderRectangle() As Rectangle

        Dim r As New Rectangle With {.X = 0, .Y = 0, .Width = Me.Width - 1, .Height = Me.Height - 1}

        Return r

    End Function

    ''' <summary>
    ''' Berechnet das Verhältnis des Werts zur aktuellen Grösse der ProgressBar.
    ''' </summary>
    ''' <param name="value">Wert im Verhältnis zum Maximum.</param>
    Private Function GetRelativeValue(ByVal value As Single) As Single

        Dim rV As Single = CSng((value * 100) / Me.maximumValue)

        Dim rR As Single

        If Me.drawVertical Then
            rR = CSng((Me.Height / 100) * rV)

        Else

            rR = CSng((Me.Width / 100) * rV)
        End If

        Return rR

    End Function

    ''' <summary>
    ''' Umschalten auf Vertikal.
    ''' </summary>
    Private Sub SetVertical()

        Me.Size = New Size(Me.Height, Me.Width)

    End Sub

    ''' <summary>
    ''' Umschalten auf Horizontal.
    ''' </summary>
    Private Sub SetHorizontal()

        Me.Size = New Size(Me.Height, Me.Width)

    End Sub

#Region "Initialize"
    ''' <summary>
    ''' UserControl initialisieren.
    ''' </summary>
    Private Sub InitializeComponent()

        Me.SuspendLayout()
        Me.Size = New Size(150, 30)
        Me.BackColor = Color.Black
        Me.ResumeLayout(False)

    End Sub

    ''' <summary>
    ''' Doublebuffer einschalten bzw. Zeichnenverhalten festlegen.
    ''' </summary>
    Private Sub EnableDoubleBuffering()

        Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
        Me.SetStyle(ControlStyles.UserPaint, True)
        Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
        Me.UpdateStyles()

    End Sub

#End Region

End Class

' --------------- Ende Datei ucProgressBar.vb  ---------------
' ------- Ende Projektdatei VariableProgressBar.vbproj -------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Folgende Diskussionen existieren bereits

Variable Progressbar - Dario 15.05.2009 18:29

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.