Metro-ProgressBar

    • VB.NET

    Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von CFHackerExtreme.

      Metro-ProgressBar

      Ich war am Wochenende krank :S und habe deswegen ein bisschen angefangen ein kleines Control zu schreiben.
      Der Code ist teilweise ziemlich ranzig, ich weiß. Aber da dies' mein erstes Control ist, bitte ich um rücksicht. Kritik ist seeehr gerne erwünscht, da ich mich im Bereich Controls weiterbilden möchte.

      VB.NET-Quellcode

      1. Option Strict On
      2. Imports System.ComponentModel
      3. ''' <summary>
      4. ''' Eine ProgressBar im Metro-look.
      5. ''' </summary>
      6. Public Class MetroProgressBar
      7. Inherits Control
      8. 'Private Propertys
      9. Private _CValue As Integer
      10. Private _CWidth As Integer
      11. Private _MValue As Integer
      12. Private _MiValue As Integer
      13. Private _BGColor As Color = Color.FromArgb(230, 230, 230)
      14. Private _PColor As Color = Color.FromArgb(6, 176, 37)
      15. 'Public Propertys
      16. ''' <summary>
      17. ''' Gibt den aktuellen Wert der ProgressBar zurück oder legt diesen fest.
      18. ''' </summary>
      19. ''' <value>Den Wert der ProgressBar</value>
      20. ''' <returns>Den aktuellen Wert der ProgressBar</returns>
      21. <Browsable(True), Description("Der aktuelle Wert der ProgressBar.")> _
      22. Public Property Value As Integer
      23. Get
      24. Return _CValue
      25. Invalidate()
      26. End Get
      27. Set(value As Integer)
      28. If _CValue < _MValue Then
      29. _CValue = value
      30. _CWidth = CInt((Me.Width / 100) * value)
      31. Invalidate()
      32. End If
      33. End Set
      34. End Property
      35. ''' <summary>
      36. ''' Legt den Maximal-wert der ProgressBar fest oder ruft diesen ab.
      37. ''' </summary>
      38. ''' <value>Den Maximalwert der ProgressBar</value>
      39. ''' <returns>Den Maximal-wert der ProgressBar</returns>
      40. <Browsable(True), Description("Die Maximale Value der ProgressBar.")> _
      41. Public Property MaxValue As Integer
      42. Get
      43. Return _MValue
      44. End Get
      45. Set(value As Integer)
      46. _MValue = value
      47. Invalidate()
      48. End Set
      49. End Property
      50. Sub New()
      51. Me.Size = New Size(192, 23)
      52. Me.DoubleBuffered = True
      53. MaxValue = 100
      54. End Sub
      55. Protected Overrides Sub OnPaint(e As PaintEventArgs)
      56. MyBase.OnPaint(e)
      57. With e.Graphics
      58. 'Graphic Settings
      59. .SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
      60. .TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit
      61. .PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
      62. .InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear
      63. .CompositingQuality = Drawing2D.CompositingQuality.HighQuality
      64. 'Draw Bar
      65. .FillRectangle(New SolidBrush(_BGColor), 0, 0, Width - 1, Height - 1)
      66. .DrawRectangle(New Pen(Color.FromArgb(188, 188, 188)), DisplayRectangle)
      67. 'Draw Progress
      68. .FillRectangle(New SolidBrush(_PColor), 1, 1, _CWidth, Height - 1)
      69. End With
      70. End Sub
      71. End Class

      CFHackerExtreme schrieb:

      Private Propertys

      Das sind in dem Fall keine Properties, sondern Felder bzw. Variablen, die du evtl umbenennen solltest (guideline-konform) mit UpperCamelCase usw.

      Du solltest den einzelnen Properties zudem noch Kategorien zuordnen, damit man das Zeugs besser findet.
      Das Browsable-Attribut brauchst du nicht, so lange du es nicht auf False setzt.

      MaxValue etc. würde ich einfach mit Maximum umschreiben, sieht besser aus und ist weiter verbreitet, zumal die normale ProgressBar das ja auch nutzt.
      Zudem fehlen da Imports-Direktiven. Den Konstruktor würde ich noch als Public modifizieren und die optimalen Einstellungen so aufrufen:

      VB.NET-Quellcode

      1. SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.UserPaint Or ControlStyles.ResizeRedraw, True)
      2. UpdateStyles()


      Zudem berechnest du die Breite falsch. Die musst du so berechnen:

      VB.NET-Quellcode

      1. _CWidth * (_CValue - MinValue) \ (MaxValue - MinValue)


      Wozu brauchst du denn das TextRenderingHint? Du zeichnest ja keinen Text oder ähnliches, also schmeiß das raus.
      Ich würde zudem noch weitere Einstellungen überlassen, aber ok, das ist ja der Sourcecode-Austausch.
      Und der Englisch-Deutsch-Mischmasch ist auch nicht so gut. Zudem würde ich die Breite usw. dann in der OnPaint-Methode setzen, nicht in der Properties.
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

      CFHackerExtreme schrieb:

      Get Return _CValue Invalidate() End Get

      Wieso ein Invalidate im GET, das hat soziemlich 0 Sinn. Das muss da raus :)