Beschreibung:
MultiBar ist ein vielseitiges und leicht anpassbares Benutzersteuerelement, das Funktionalitäten von TrackBar, ProgressBar und ScrollBar vereint und diese beliebig kombinierbar macht. Die MultiBar kommt standardmäßig im Windows-Stil daher, unterstützt aber auch komplettes Ownerdrawing für das Entwerfen eigener Stile.
Screenshot:
Klassendiagramm:
Wie erstelle ich eigene Renderer?
Spoiler anzeigen
Verwendete Programmiersprache und IDE:
Visual Basic .NET (IDE: VS 2012 Ultimate)
Systemanforderungen:
.NET Framework 2.0
Download:
MultiBar.zip (20 kB)
Changelog:
Version 1.1
- Fortschrittsbalken überdeckt nun nicht mehr den Rahmen des Hintergrunds
- Rechteck des Fortschrittsbalkens bei CustomDraw angepasst
Version 1.2
- die Multibar aktualisiert sich nun nach Ändern von Min- und MaxValue
- Fehler bei MinValue <> 0 behoben
Version 1.3
- Increment und Decrement Methoden hinzugefügt
- ExactTick und StepValue Eigenschaften hinzugefügt
- ButtonClicked Ereignis hinzugefürt
- Renderqualität verbessert
- Testanwendung verbessert
Version 2.0
- Beschreibungen und Standardwerte hinzugefügt
- ExactTick-Eigenschaft durch LockStyle-Eigenschaft (mit mehr Möglichkeiten) ersetzt
- Rendersystem komplett überarbeitet
Version 2.1
- kleine Änderung im Verhalten des Sliders
- Direction-Eigenschaft hinzugefügt (entweder links-nach-rechts oder rechts-nach-links)
Version 2.2
- die MultiBar sollte nun nach Ändern von Min-/MaxValue neugezeichnet werden
- Code aufgeräumt und optimiert
Version 2.3
- Renderbug der Trackbar mit Buttons behoben
Lizenz/Weitergabe:
Freeware, einkompilieren erlaubt
MultiBar ist ein vielseitiges und leicht anpassbares Benutzersteuerelement, das Funktionalitäten von TrackBar, ProgressBar und ScrollBar vereint und diese beliebig kombinierbar macht. Die MultiBar kommt standardmäßig im Windows-Stil daher, unterstützt aber auch komplettes Ownerdrawing für das Entwerfen eigener Stile.
Screenshot:
Klassendiagramm:
Wie erstelle ich eigene Renderer?
Die MultiBar ist dafür gedacht, eigene Stile dafür zu entwerfen.
Wie ihr das anstellt werde ich nun anhand der beiden Beispiele auf dem Bild erklären.
Zuerst müssen wir eigene Renderer erstellen. Dafür leiten wir eine Klasse von der MultiBarrenderer-Klasse ab:
Dabei wird automatisch eine OnDrawBar-Methode generiert, wie ihr im Beispiel sehen könnt.
Dort kommt nun das Ownerdrawing rein:
Falls sich jemand fragt: Die ersten drei Funktionen in der BlueTrackBarRenderer-Klasse sind nur dafür da, die runden Ecken zu zeichnen.
Und zu guter letzt müssen wir den MultiBars ihre Eigenschaften und Renderer zuweisen. Das machen wir am besten im Form_Load:
Das ist aber natürlich nur ein kleiner Beispielcode den ich auf die Schnelle für die Demonstration geschrieben habe. Es gehen noch viel aufwändigere Dinge, eurer Fantasie ist quasi keine Grenze gesetzt. Aber ich hoffe dennoch ich konnte euch hiermit einen kleinen Überblick verschaffen, was alles möglich ist und wie ihr es anstellen könnt.
Wie ihr das anstellt werde ich nun anhand der beiden Beispiele auf dem Bild erklären.
Zuerst müssen wir eigene Renderer erstellen. Dafür leiten wir eine Klasse von der MultiBarrenderer-Klasse ab:
VB.NET-Quellcode
Dabei wird automatisch eine OnDrawBar-Methode generiert, wie ihr im Beispiel sehen könnt.
Dort kommt nun das Ownerdrawing rein:
VB.NET-Quellcode
- Friend Class BlueTrackBarRenderer : Inherits MultiBarRenderer
- Private Shared Sub DrawRoundedRectangle(ByVal g As Graphics, ByVal r As RectangleF, ByVal radius As Single, ByVal pen As Pen)
- Dim path As GraphicsPath = RectanglePath(r, radius)
- g.DrawPath(pen, path)
- path.Dispose()
- End Sub
- Private Shared Sub FillRoundedRectangle(ByVal g As Graphics, ByVal r As RectangleF, ByVal radius As Single, ByVal fillBrush As Brush)
- Dim path As GraphicsPath = RectanglePath(r, radius)
- g.FillPath(fillBrush, path)
- path.Dispose()
- End Sub
- Private Shared Function RectanglePath(ByVal r As RectangleF, ByVal radius As Single) As GraphicsPath
- Dim path As New GraphicsPath
- Dim d As Single = 2 * radius
- With path
- If radius < 1 Then
- .AddRectangle(r)
- Else
- .AddArc(r.X + r.Width - d, r.Y, d, d, 270, 90)
- .AddArc(r.X + r.Width - d, r.Y + r.Height - d, d, d, 0, 90)
- .AddArc(r.X, r.Y + r.Height - d, d, d, 90, 90)
- .AddArc(r.X, r.Y, d, d, 180, 90)
- End If
- .CloseFigure()
- End With
- Return (path)
- End Function
- Protected Overrides Sub OnDrawBar(e As MultiBarDrawEventArgs)
- Dim r = e.ElementRect
- Dim g = e.Graphics
- Select Case e.Element
- Case MultiBarElement.Slider
- Dim p As New GraphicsPath
- p.AddEllipse(r)
- Dim b As New PathGradientBrush(p)
- b.CenterPoint = New PointF(r.Width / 2.0F + r.X, r.Height / 2.0F + r.Y)
- b.CenterColor = Color.FromArgb(200, 200, 200)
- b.SurroundColors = {Color.FromArgb(140, 140, 140)}
- b.SetBlendTriangularShape(0.5F, 0.9F)
- b.FocusScales = New PointF(0, 0)
- Dim sliderRect As New RectangleF(r.X, r.Y + 0.5F, r.Width, r.Height - 1)
- g.FillEllipse(b, sliderRect)
- g.DrawEllipse(Pens.DimGray, sliderRect)
- b.Dispose()
- Case MultiBarElement.Bar
- Dim barRect As New RectangleF(r.X + 0.5F, 5.5F, r.Width - 1, 14)
- Dim b As New SolidBrush(Color.FromArgb(210, 210, 220))
- FillRoundedRectangle(g, barRect, 7, b)
- b.Dispose()
- Dim p As New Pen(Color.FromArgb(30, 30, 30), 1)
- DrawRoundedRectangle(g, barRect, 7, p)
- p.Dispose()
- Case MultiBarElement.Progress
- Dim progressRect As New RectangleF(r.X, 6, r.Width, 13)
- Dim b As New LinearGradientBrush(progressRect, Color.LightBlue, Color.Blue, LinearGradientMode.Vertical)
- FillRoundedRectangle(g, progressRect, 6, b)
- b.Dispose()
- End Select
- End Sub
- End Class
- Friend Class OrangeProgressBarRenderer : Inherits MultiBarRenderer
- Protected Overrides Sub OnDrawBar(e As MultiBarDrawEventArgs)
- Dim g = e.Graphics
- Select Case e.Element
- Case MultiBarElement.Bar
- g.FillRectangle(Brushes.LightSteelBlue, e.ElementRect)
- g.DrawRectangle(Pens.Gray, e.ElementRect.X + 0.5F, e.ElementRect.Y + 0.5F, e.ElementRect.Width - 1, e.ElementRect.Height - 1)
- Case MultiBarElement.Progress
- g.FillRectangle(Brushes.OrangeRed, e.ElementRect)
- g.FillRectangle(Brushes.Orange, New Rectangle(e.ElementRect.X, e.ElementRect.Y, e.ElementRect.Width, Convert.ToInt32(e.ElementRect.Height * 0.3)))
- End Select
- End Sub
- End Class
Falls sich jemand fragt: Die ersten drei Funktionen in der BlueTrackBarRenderer-Klasse sind nur dafür da, die runden Ecken zu zeichnen.
Und zu guter letzt müssen wir den MultiBars ihre Eigenschaften und Renderer zuweisen. Das machen wir am besten im Form_Load:
VB.NET-Quellcode
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Me.MultiBar1.ShowButtons = False
- Me.MultiBar1.SliderWidth = 24
- Me.MultiBar1.Style = MultiBar.MultiBarStyle.Progress
- Me.MultiBar1.Value = 50
- Me.MultiBar2.AllowScroll = False
- Me.MultiBar2.ShowButtons = False
- Me.MultiBar2.Style = MultiBar.MultiBarStyle.Progress
- Me.MultiBar2.ValueStyle = MultiBar.MultiBarValueStyle.Percent
- Dim renderer1 As New BlueTrackBarRenderer
- Dim renderer2 As New OrangeProgressBarRenderer
- MultiBar1.SetRenderer(renderer1)
- MultiBar2.SetRenderer(renderer2)
- End Sub
Das ist aber natürlich nur ein kleiner Beispielcode den ich auf die Schnelle für die Demonstration geschrieben habe. Es gehen noch viel aufwändigere Dinge, eurer Fantasie ist quasi keine Grenze gesetzt. Aber ich hoffe dennoch ich konnte euch hiermit einen kleinen Überblick verschaffen, was alles möglich ist und wie ihr es anstellen könnt.
Verwendete Programmiersprache und IDE:
Visual Basic .NET (IDE: VS 2012 Ultimate)
Systemanforderungen:
.NET Framework 2.0
Download:
MultiBar.zip (20 kB)
Changelog:
Version 1.1
- Fortschrittsbalken überdeckt nun nicht mehr den Rahmen des Hintergrunds
- Rechteck des Fortschrittsbalkens bei CustomDraw angepasst
Version 1.2
- die Multibar aktualisiert sich nun nach Ändern von Min- und MaxValue
- Fehler bei MinValue <> 0 behoben
Version 1.3
- Increment und Decrement Methoden hinzugefügt
- ExactTick und StepValue Eigenschaften hinzugefügt
- ButtonClicked Ereignis hinzugefürt
- Renderqualität verbessert
- Testanwendung verbessert
Version 2.0
- Beschreibungen und Standardwerte hinzugefügt
- ExactTick-Eigenschaft durch LockStyle-Eigenschaft (mit mehr Möglichkeiten) ersetzt
- Rendersystem komplett überarbeitet
Version 2.1
- kleine Änderung im Verhalten des Sliders
- Direction-Eigenschaft hinzugefügt (entweder links-nach-rechts oder rechts-nach-links)
Version 2.2
- die MultiBar sollte nun nach Ändern von Min-/MaxValue neugezeichnet werden
- Code aufgeräumt und optimiert
Version 2.3
- Renderbug der Trackbar mit Buttons behoben
Lizenz/Weitergabe:
Freeware, einkompilieren erlaubt
Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „Artentus“ ()