Hallo Ihr Lieben,
Ich habe mal eine kleine Grundsatzfrage und hoffe das ich im richtigen Teil des Forums poste
Ich habe einen Button per GDI+ erstellt, dabei ist mir eine Grundsatzfrage aufgekommen, ist es "besser" direkt mit e.Graphics zu arbeiten, oder sollte man lieber ein eigenes Graphics Object verwenden ?
Kompletter Code des Buttons wie ich Ihn Aktuell verwende:
Spoiler anzeigen
Nur Paint (Eigenes Graphics Object)
Spoiler anzeigen
Nur Paint (e.graphics)
Spoiler anzeigen
Welche Methodik wäre die sinnvollere und weswegen ?
Mein erster Gedanke wäre das evtl. Ram-Vorteile bestehen könnten, aber zumindest lt. Visual Studio 2017 ist bei keiner der Methoden ein Verbrauchsunterschied erkennbar.
LG
Ich habe mal eine kleine Grundsatzfrage und hoffe das ich im richtigen Teil des Forums poste
Ich habe einen Button per GDI+ erstellt, dabei ist mir eine Grundsatzfrage aufgekommen, ist es "besser" direkt mit e.Graphics zu arbeiten, oder sollte man lieber ein eigenes Graphics Object verwenden ?
Kompletter Code des Buttons wie ich Ihn Aktuell verwende:
VB.NET-Quellcode
- Public Class DKButton
- Private MouseState As Helpers.MouseState = Helpers.MouseState.None
- Public Sub New()
- InitializeComponent()
- Me.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.ResizeRedraw Or ControlStyles.UserPaint, True)
- DoubleBuffered = True
- Me.UpdateStyles()
- End Sub
- Dim _BackGroundColor As Color = Color.DarkGray
- Public Property BackGroundColor As Color
- Get
- Return _BackGroundColor
- End Get
- Set(value As Color)
- _BackGroundColor = value
- Invalidate()
- End Set
- End Property
- Dim _HoverColor As Color = Color.DimGray
- Public Property HoverColor As Color
- Get
- Return _HoverColor
- End Get
- Set(value As Color)
- _HoverColor = value
- Invalidate()
- End Set
- End Property
- Dim _ClickColor As Color = Color.OrangeRed
- Public Property ClickColor As Color
- Get
- Return _ClickColor
- End Get
- Set(value As Color)
- _ClickColor = value
- Invalidate()
- End Set
- End Property
- Dim _TextColor As Color = Color.White
- Public Property TextColor As Color
- Get
- Return _TextColor
- End Get
- Set(value As Color)
- _TextColor = value
- Invalidate()
- End Set
- End Property
- Dim _TextFont As Font = Font
- Public Property TextFont As Font
- Get
- Return _TextFont
- End Get
- Set(value As Font)
- _TextFont = value
- Invalidate()
- End Set
- End Property
- Dim _ButtonText As String = "X"
- Public Property ButtonText As String
- Get
- Return _ButtonText
- End Get
- Set(value As String)
- _ButtonText = value
- Invalidate()
- End Set
- End Property
- Dim _Border As Boolean = True
- Property Border As Boolean
- Get
- Return _Border
- End Get
- Set(value As Boolean)
- _Border = value
- Invalidate()
- End Set
- End Property
- Dim _BorderColor As Color = Color.Black
- Public Property BorderColor As Color
- Get
- Return _BorderColor
- End Get
- Set(value As Color)
- _BorderColor = value
- Invalidate()
- End Set
- End Property
- Dim _Hatch As Boolean = True
- Property Hatch As Boolean
- Get
- Return _Hatch
- End Get
- Set(value As Boolean)
- _Hatch = value
- Invalidate()
- End Set
- End Property
- Dim _HatchColor As Color = Color.Gray
- Property HatchColor As Color
- Get
- Return _HatchColor
- End Get
- Set(value As Color)
- _HatchColor = value
- Invalidate()
- End Set
- End Property
- Dim _GlassEffect As Boolean = True
- Property GlassEffect As Boolean
- Get
- Return _GlassEffect
- End Get
- Set(value As Boolean)
- _GlassEffect = value
- Invalidate()
- End Set
- End Property
- Dim _GlassEffectColor As Color = Color.White
- Property GlassEffectColor As Color
- Get
- Return _GlassEffectColor
- End Get
- Set(value As Color)
- _GlassEffectColor = value
- Invalidate()
- End Set
- End Property
- Private Function GetTextPosition(ByVal TextSize As SizeF) As PointF
- Dim DrawToRect As Rectangle = New Rectangle(0, 0, Me.Width, Me.Height)
- Return New PointF(((DrawToRect.Width \ 2) - (CInt(TextSize.Width) \ 2)), ((DrawToRect.Height \ 2) - (CInt(TextSize.Height) \ 2)))
- End Function
- Protected Overrides Sub OnPaint(e As PaintEventArgs)
- Using B As New Bitmap(Width, Height)
- Using G As Graphics = Graphics.FromImage(B)
- With G
- .TextRenderingHint = TextRenderingHint.ClearTypeGridFit
- .SmoothingMode = SmoothingMode.AntiAlias
- .InterpolationMode = InterpolationMode.HighQualityBicubic
- .CompositingQuality = CompositingQuality.HighQuality
- .PixelOffsetMode = PixelOffsetMode.HighQuality
- Dim tmp_Color As Color = Color.DarkGray
- Select Case MouseState
- Case Helpers.MouseState.None
- tmp_Color = _BackGroundColor
- Case Helpers.MouseState.Over
- tmp_Color = _HoverColor
- Case Helpers.MouseState.Pressed
- tmp_Color = _ClickColor
- End Select
- Using BackgroundBrush As New SolidBrush(tmp_Color)
- .FillRectangle(BackgroundBrush, New Rectangle(0, 0, Me.Width, Me.Height))
- End Using
- If _Hatch Then
- Using HatchBrush As New HatchBrush(HatchStyle.DarkDownwardDiagonal, Color.FromArgb(75, _HatchColor), Color.Transparent)
- .FillRectangle(HatchBrush, New Rectangle(0, 0, Me.Width, Me.Height))
- End Using
- End If
- If _GlassEffect Then
- Using GlassEffectBrush As New LinearGradientBrush(New Rectangle(0, 0, Me.Width, Me.Height \ 2), Color.FromArgb(180, _GlassEffectColor), Color.FromArgb(25, _GlassEffectColor), LinearGradientMode.Vertical)
- .FillRectangle(GlassEffectBrush, New Rectangle(0, 0, Me.Width, Me.Height \ 2))
- End Using
- End If
- If _Border Then
- Using BorderBrush As New SolidBrush(_BorderColor)
- Using BorderPen As New Pen(BorderBrush, 2)
- .DrawRectangle(BorderPen, New Rectangle(0, 0, Me.Width, Me.Height))
- End Using
- End Using
- End If
- Using ButtonTextBrush As New SolidBrush(_TextColor)
- .DrawString(ButtonText, Font, ButtonTextBrush, GetTextPosition(.MeasureString(ButtonText, Font)), StringFormat.GenericDefault)
- End Using
- End With
- End Using
- With e.Graphics
- .TextRenderingHint = TextRenderingHint.ClearTypeGridFit
- .SmoothingMode = SmoothingMode.AntiAlias
- .InterpolationMode = InterpolationMode.HighQualityBicubic
- .CompositingQuality = CompositingQuality.HighQuality
- .PixelOffsetMode = PixelOffsetMode.HighQuality
- .DrawImage(B, New PointF(0, 0))
- End With
- End Using
- End Sub
- Protected Overrides Sub OnMouseEnter(e As EventArgs)
- MouseState = Helpers.MouseState.Over
- Invalidate()
- MyBase.OnMouseEnter(e)
- End Sub
- Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
- MouseState = Helpers.MouseState.Pressed
- Invalidate()
- MyBase.OnMouseDown(e)
- End Sub
- Protected Overrides Sub OnMouseLeave(e As EventArgs)
- MouseState = Helpers.MouseState.None
- Invalidate()
- MyBase.OnMouseEnter(e)
- End Sub
- Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
- MouseState = Helpers.MouseState.None
- Invalidate()
- MyBase.OnMouseUp(e)
- End Sub
- End Class
- Public Class Helpers
- Public Enum MouseState
- None
- Over
- Pressed
- End Enum
- End Class
Nur Paint (Eigenes Graphics Object)
VB.NET-Quellcode
- Protected Overrides Sub OnPaint(e As PaintEventArgs)
- Using B As New Bitmap(Width, Height)
- Using G As Graphics = Graphics.FromImage(B)
- With G
- .TextRenderingHint = TextRenderingHint.ClearTypeGridFit
- .SmoothingMode = SmoothingMode.AntiAlias
- .InterpolationMode = InterpolationMode.HighQualityBicubic
- .CompositingQuality = CompositingQuality.HighQuality
- .PixelOffsetMode = PixelOffsetMode.HighQuality
- Dim tmp_Color As Color = Color.DarkGray
- Select Case MouseState
- Case Helpers.MouseState.None
- tmp_Color = _BackGroundColor
- Case Helpers.MouseState.Over
- tmp_Color = _HoverColor
- Case Helpers.MouseState.Pressed
- tmp_Color = _ClickColor
- End Select
- Using BackgroundBrush As New SolidBrush(tmp_Color)
- .FillRectangle(BackgroundBrush, New Rectangle(0, 0, Me.Width, Me.Height))
- End Using
- If _Hatch Then
- Using HatchBrush As New HatchBrush(HatchStyle.DarkDownwardDiagonal, Color.FromArgb(75, _HatchColor), Color.Transparent)
- .FillRectangle(HatchBrush, New Rectangle(0, 0, Me.Width, Me.Height))
- End Using
- End If
- If _GlassEffect Then
- Using GlassEffectBrush As New LinearGradientBrush(New Rectangle(0, 0, Me.Width, Me.Height \ 2), Color.FromArgb(180, _GlassEffectColor), Color.FromArgb(25, _GlassEffectColor), LinearGradientMode.Vertical)
- .FillRectangle(GlassEffectBrush, New Rectangle(0, 0, Me.Width, Me.Height \ 2))
- End Using
- End If
- If _Border Then
- Using BorderBrush As New SolidBrush(_BorderColor)
- Using BorderPen As New Pen(BorderBrush, 2)
- .DrawRectangle(BorderPen, New Rectangle(0, 0, Me.Width, Me.Height))
- End Using
- End Using
- End If
- Using ButtonTextBrush As New SolidBrush(_TextColor)
- .DrawString(ButtonText, Font, ButtonTextBrush, GetTextPosition(.MeasureString(ButtonText, Font)), StringFormat.GenericDefault)
- End Using
- End With
- End Using
- With e.Graphics
- .TextRenderingHint = TextRenderingHint.ClearTypeGridFit
- .SmoothingMode = SmoothingMode.AntiAlias
- .InterpolationMode = InterpolationMode.HighQualityBicubic
- .CompositingQuality = CompositingQuality.HighQuality
- .PixelOffsetMode = PixelOffsetMode.HighQuality
- .DrawImage(B, New PointF(0, 0))
- End With
- End Using
- End Sub
Nur Paint (e.graphics)
VB.NET-Quellcode
- Protected Overrides Sub OnPaint(e As PaintEventArgs)
- With e.Graphics
- .TextRenderingHint = TextRenderingHint.ClearTypeGridFit
- .SmoothingMode = SmoothingMode.AntiAlias
- .InterpolationMode = InterpolationMode.HighQualityBicubic
- .CompositingQuality = CompositingQuality.HighQuality
- .PixelOffsetMode = PixelOffsetMode.HighQuality
- Dim tmp_Color As Color = Color.DarkGray
- Select Case MouseState
- Case Helpers.MouseState.None
- tmp_Color = _BackGroundColor
- Case Helpers.MouseState.Over
- tmp_Color = _HoverColor
- Case Helpers.MouseState.Pressed
- tmp_Color = _ClickColor
- End Select
- Using BackgroundBrush As New SolidBrush(tmp_Color)
- .FillRectangle(BackgroundBrush, New Rectangle(0, 0, Me.Width, Me.Height))
- End Using
- If _Hatch Then
- Using HatchBrush As New HatchBrush(HatchStyle.DarkDownwardDiagonal, Color.FromArgb(75, _HatchColor), Color.Transparent)
- .FillRectangle(HatchBrush, New Rectangle(0, 0, Me.Width, Me.Height))
- End Using
- End If
- If _GlassEffect Then
- Using GlassEffectBrush As New LinearGradientBrush(New Rectangle(0, 0, Me.Width, Me.Height \ 2), Color.FromArgb(180, _GlassEffectColor), Color.FromArgb(25, _GlassEffectColor), LinearGradientMode.Vertical)
- .FillRectangle(GlassEffectBrush, New Rectangle(0, 0, Me.Width, Me.Height \ 2))
- End Using
- End If
- If _Border Then
- Using BorderBrush As New SolidBrush(_BorderColor)
- Using BorderPen As New Pen(BorderBrush, 2)
- .DrawRectangle(BorderPen, New Rectangle(0, 0, Me.Width, Me.Height))
- End Using
- End Using
- End If
- Using ButtonTextBrush As New SolidBrush(_TextColor)
- .DrawString(ButtonText, Font, ButtonTextBrush, GetTextPosition(.MeasureString(ButtonText, Font)), StringFormat.GenericDefault)
- End Using
- End With
- End Sub
Welche Methodik wäre die sinnvollere und weswegen ?
Mein erster Gedanke wäre das evtl. Ram-Vorteile bestehen könnten, aber zumindest lt. Visual Studio 2017 ist bei keiner der Methoden ein Verbrauchsunterschied erkennbar.
LG
If Energy = Low Then
Drink(aHugeCoffee)
Else
Drink(aHugeCoffeeToo)
End If
Drink(aHugeCoffee)
Else
Drink(aHugeCoffeeToo)
End If