Ich habe dieses Thema mal in "GDI Controltechniken" geändert, da ich es doch irgendwie sinnvoller halte, mehr solche Techniker zu erklären.
Die alten Codes befinden sich unten.
1. Timer im Designer laufen lassen.
Spoiler anzeigen
Theorie:
Wie möchten bei unserem Control gerne eine Visualisierung im Designer laufen lassen. Dazu können wir einen Timer benutzen, den wir im Designer starten.
Mehr ist es eigentlich nicht. Hier ein simples Beispiel.
2. Mouse-Events
Spoiler anzeigen
Theorie: Wir wollen bei MouseEvents im Control selber festlegen, was mit dem Aussehen passieren soll. Dafür wollen wir die Events vom geerbten Control benutzen.
3. Farbveränderung (Übergang)
Spoiler anzeigen
Theorie: Wir wollen z.B im Click, oder Hover, die Farbe verändern. Wir könnten einfach sagen: "Me.BackColor = Color.X" Das ist aber nicht gerade schön anzusehen.
Wir wollen also die Farbe gleichmäßig verändern. Dafür bietet uns die Color-Klasse die ARGB-Funktion, mit dessen Hilfe wir kleine Veränderungen realisieren können.
4. Transparenz
Spoiler anzeigen
Die alten Codes befinden sich unten.
1. Timer im Designer laufen lassen.
Theorie:
Wie möchten bei unserem Control gerne eine Visualisierung im Designer laufen lassen. Dazu können wir einen Timer benutzen, den wir im Designer starten.
Mehr ist es eigentlich nicht. Hier ein simples Beispiel.
VB.NET-Quellcode
- Option Strict On
- Public Class Progress
- Inherits Control
- Private WithEvents timer As New Timer With {.Interval = 10} 'Timer der im Designer läuft
- Private _VisualStyle As Style 'Style Private
- Public Property Value As Integer = 0 'Die Value
- Public Property VisualStyle As Style 'Die Style Property
- Get
- Return _VisualStyle
- End Get
- Set(ByVal value As Style)
- If value = Style.Normal Then
- Else
- Me.Value = 0 'Wenn Style = Visuell ist, dann starte den Timer
- timer.Start()
- End If
- End Set
- End Property
- Enum Style
- Normal
- Visuell
- End Enum
- Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
- MyBase.OnPaint(e)
- e.Graphics.FillRectangle(Brushes.Gainsboro, New Rectangle(0, 0, Me.Width - 1, Me.Height - 1))
- e.Graphics.FillRectangle(Brushes.LimeGreen, New Rectangle(0, 0, CInt((Me.Value * Me.Width) / 100), Me.Height))
- e.Graphics.DrawRectangle(Pens.Silver, New Rectangle(0, 0, CInt((Me.Value * Me.Width) / 100), Me.Height))
- e.Graphics.DrawRectangle(Pens.Silver, New Rectangle(0, 0, Me.Width - 1, Me.Height - 1))
- End Sub
- Private Sub timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles timer.Tick
- If Me.Value <> 100 Then
- Me.Value += 1 'Value erhöhen
- Else
- timer.Stop()
- End If
- Me.Invalidate() 'Neu zeichnen
- End Sub
- Sub New()
- Me.DoubleBuffered = True
- End Sub
- End Class
2. Mouse-Events
Theorie: Wir wollen bei MouseEvents im Control selber festlegen, was mit dem Aussehen passieren soll. Dafür wollen wir die Events vom geerbten Control benutzen.
VB.NET-Quellcode
- Public Class Panel
- Inherits Control
- Private _MouseState As MouseState 'Das Attribut
- Public Enum MouseState As Byte 'Die Enumeration
- None
- Hover
- Pressed
- End Enum
- #Region "Mouse-Events"
- Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs)
- MyBase.OnMouseEnter(e)
- Me._MouseState = MouseState.Hover
- Me.Invalidate()
- End Sub
- Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
- MyBase.OnMouseEnter(e)
- Me._MouseState = MouseState.None
- Me.Invalidate()
- End Sub
- Protected Overrides Sub OnMouseDown(ByVal mevent As System.Windows.Forms.MouseEventArgs)
- MyBase.OnMouseDown(mevent)
- Me._MouseState = MouseState.Pressed
- Me.Invalidate()
- End Sub
- Protected Overrides Sub OnMouseUp(ByVal mevent As System.Windows.Forms.MouseEventArgs)
- MyBase.OnMouseUp(mevent)
- Me._MouseState = MouseState.Hover
- Me.Invalidate()
- End Sub
- #End Region
- Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
- MyBase.OnPaint(e)
- If _MouseState = MouseState.None Then
- e.Graphics.FillRectangle(New System.Drawing.Drawing2D.LinearGradientBrush(Me.ClientRectangle, Color.White, Color.White, 10), Me.ClientRectangle)
- ElseIf _MouseState = MouseState.Hover Then
- e.Graphics.FillRectangle(New System.Drawing.Drawing2D.LinearGradientBrush(Me.ClientRectangle, Color.Gray, Color.Silver, 10), Me.ClientRectangle)
- ElseIf _MouseState = MouseState.Pressed Then
- e.Graphics.FillRectangle(New System.Drawing.Drawing2D.LinearGradientBrush(Me.ClientRectangle, Color.Blue, Color.DodgerBlue, 10), Me.ClientRectangle)
- End If
- End Sub
- End Class
3. Farbveränderung (Übergang)
Theorie: Wir wollen z.B im Click, oder Hover, die Farbe verändern. Wir könnten einfach sagen: "Me.BackColor = Color.X" Das ist aber nicht gerade schön anzusehen.
Wir wollen also die Farbe gleichmäßig verändern. Dafür bietet uns die Color-Klasse die ARGB-Funktion, mit dessen Hilfe wir kleine Veränderungen realisieren können.
VB.NET-Quellcode
- Option Strict On
- Public Class Control_
- Inherits Control
- Public Property c As Color
- Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
- MyBase.OnPaint(e)
- e.Graphics.FillRectangle(New SolidBrush(c), Me.ClientRectangle)
- e.Graphics.DrawRectangle(Pens.DodgerBlue, New Rectangle(0, 0, Me.Width - 1, Me.Height - 1))
- End Sub
- Sub New()
- Me.DoubleBuffered = True
- Me.BackColor = Color.White
- End Sub
- Public WithEvents timer As New Timer With {.Interval = 50}
- Private Sub timer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles timer.Tick
- If c.A < 255 Then
- c = Color.FromArgb((c.A + 5), c.R, c.G, c.B)
- Me.Invalidate()
- Else
- timer.Stop()
- End If
- End Sub
- End Class
4. Transparenz
VB.NET-Quellcode
- Sub New()
- MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
- End Sub
- Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
- MyBase.OnPaint(e)
- e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
- e.Graphics.FillPie(Brushes.DodgerBlue, New Rectangle(0, 0, Me.Width, Me.Height), 0, 360)
- End Sub
- Protected Overrides ReadOnly Property CreateParams() As CreateParams
- Get
- Dim cp As CreateParams = MyBase.CreateParams
- cp.ExStyle = cp.ExStyle Or &H20
- 'WS_EX_TRANSPARENT
- Return cp
- End Get
- End Property
- Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs)
- MyBase.OnPaintBackground(pevent)
- End Sub
Dieser Beitrag wurde bereits 31 mal editiert, zuletzt von „LaMiy“ ()