Tipp-Upload: VB.NET 0367: Variable ProgressBar
von Samael
Ü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.
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 |
Verwendete API-Aufrufe: |
Download: |
' 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
Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.