Ich nutze dazu folgendes Tutorial http://www.codeproject.com/Articles/2016/Writing-your-Custom-Control-step-by-step?msg=4438543#xx4438543xx , welches allerdings in C# und auf Englisch ist.
Also dazu hier von mir ein kleines Tutorial in VB und deutsch:
Was wird draus?
Es soll ein zweifarbiger Button werden. Die Farben können in Ihrer Transparenz verändert werden. Es soll die Möglichkeit geben, das sich die Farben vertauschen, wenn man mit der Maus über den Button fährt.
- Das Projekt
Neues Projekt erstellen
Menü Datei -> Neues Projekt
Unter Visual Basic -> Windows -> und rechts Windows Forms Steuerelementbibliothek auswählen
Name vergeben , Speicherort festlegen -> OK
Im ProjektmappenExplorer UserControl1.vb markieren und mit Entf Taste löschen
Über das Menü Projekt -> Neues Element hinzufügen
Im Dialog nun das Benutzerdefinierte Steuerelement auswählen -> Namen vergeben, bei mir ist es CuteButton -> Hinzufügen
Im Projektmappenexplorer das Symbol für Alle Dateien anzeigen klicken
es sollte nun unter der CuteButton.vb noch die CuteButton.Designer.vb Datei erscheinen
Diese verändert man nun folgendermaßen:
Die Zeile (dritte von oben)
Inherits System.Windows.Forms.Control
wird nun abgeaendert in
Inherits System.Windows.Forms.Button - Der Code
Es wird jetzt nur noch die Datei CuteButton.vb verändert.
Am Anfang sieht sie so aus:
MyBase.OnPaint(e)
'Benutzerdefinierten Zeichnungscode hier einfügen
End Sub
End Class
Imports System.ComponentModel
Public Class cuteButton
Private Property m_color1 As Color = Color.LightGreen
Private Property m_color2 As Color = Color.DarkBlue
Private Property m_color1Transparent As Integer = 64
Private Property m_color2Transparent As Integer = 64
Private Property m_Gradient As Single
Private Property m_SwitchAtMouseOver As Boolean
Private Property m_Text As String
Private Property m_TextAlignment As ContentAlignment = ContentAlignment.MiddleCenter
<Description("Gets and sets CuteButtons textalignment.")> _
Public Property CuteTextAlignment() As ContentAlignment
Get
Return m_TextAlignment
End Get
Set(ByVal value As ContentAlignment)
m_TextAlignment = value
Invalidate()
End Set
End Property
<Description("Gets and sets CuteButtons text.")> _
Public Property CuteText() As String
Get
Return m_Text
End Get
Set(ByVal value As String)
m_Text = value
Invalidate()
End Set
End Property
<Description("Gets and sets if the CuteColors are switched when the Mouse is over the CuteButton.")> _
Public Property CuteMouseOver() As Boolean
Get
Return m_SwitchAtMouseOver
End Get
Set(ByVal value As Boolean)
m_SwitchAtMouseOver = value
Invalidate()
End Set
End Property
<Description("Gets and sets the first gradient color")> _
Public Property CuteColor1() As Color
Get
Return m_color1
End Get
Set(ByVal value As Color)
m_color1 = value
Invalidate()
End Set
End Property
<Description("Gets and sets the second gradient color")> _
Public Property CuteColor2() As Color
Get
Return m_color2
End Get
Set(ByVal value As Color)
m_color2 = value
Invalidate()
End Set
End Property
<Description("Gets and sets the transparency for the first gradient color (Vals between 0 and 255 allowed)")> _
Public Property CuteTransparent1() As Integer
Get
Return m_color1Transparent
End Get
Set(ByVal value As Integer)
m_color1Transparent = value
'Beschränkung der eingebbaren Werte, da es ohne zu Fehlern kommen kann
If m_color1Transparent > 255 Then
m_color1Transparent = 255
End If
If m_color1Transparent < 0 Then
m_color1Transparent = 0
End If
Invalidate()
End Set
End Property
<Description("Gets and sets the transparency for the second gradient color (Vals between 0 and 255 allowed)")> _
Public Property CuteTransparent2() As Integer
Get
Return m_color2Transparent
End Get
Set(ByVal value As Integer)
m_color2Transparent = value
If m_color2Transparent > 255 Then
m_color2Transparent = 255
End If
If m_color2Transparent < 0 Then
m_color2Transparent = 0
End If
Invalidate()
End Set
End Property
<Description("Gets and sets the angle for the gradient colors (Vals between 0 and 360 allowed)")> _
Public Property CuteGradient() As Single
Get
Return m_Gradient
End Get
Set(ByVal value As Single)
m_Gradient = value
If m_Gradient > 360 Then
m_Gradient = 360
End If
If m_Gradient < 0 Then
m_Gradient = 0
End If
Invalidate()
End Set
End Property
Private Sub XB_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter
Dim oldcolor As Color
If m_SwitchAtMouseOver = True Then
oldcolor = m_color1
m_color1 = m_color2
m_color2 = oldcolor
End If
End Sub
Private Sub XB_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
Dim oldcolor As Color
If m_SwitchAtMouseOver = True Then
oldcolor = m_color1
m_color1 = m_color2
m_color2 = oldcolor
End If
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Dim c1, c2 As Color
Dim r As Rectangle
Dim style As New StringFormat()
'AusgangsStyle
style.Alignment = StringAlignment.Center
style.LineAlignment = StringAlignment.Center
'Style in Abhängigkeit des Eingstellten Properies CuteTextAlignment
Select Case m_TextAlignment
Case ContentAlignment.MiddleLeft
style.Alignment = StringAlignment.Near
style.LineAlignment = StringAlignment.Center
Case ContentAlignment.BottomLeft
style.Alignment = StringAlignment.Near
style.LineAlignment = StringAlignment.Far
Case ContentAlignment.TopLeft
style.Alignment = StringAlignment.Near
style.LineAlignment = StringAlignment.Near
Case ContentAlignment.BottomRight
style.Alignment = StringAlignment.Far
style.LineAlignment = StringAlignment.Far
Case ContentAlignment.MiddleRight
style.Alignment = StringAlignment.Far
style.LineAlignment = StringAlignment.Center
Case ContentAlignment.TopRight
style.Alignment = StringAlignment.Far
style.LineAlignment = StringAlignment.Near
Case ContentAlignment.BottomCenter
style.Alignment = StringAlignment.Center
style.LineAlignment = StringAlignment.Far
Case ContentAlignment.MiddleCenter
style.Alignment = StringAlignment.Center
style.LineAlignment = StringAlignment.Center
Case ContentAlignment.TopCenter
style.Alignment = StringAlignment.Center
style.LineAlignment = StringAlignment.Near
End Select
'Benutzerdefinierten Zeichnungscode hier einfügen
'Create two semi transparent colors
c1 = Color.FromArgb(m_color1Transparent, m_color1)
c2 = Color.FromArgb(m_color2Transparent, m_color2)
'Clientrectangel in r ablegen
r = Me.ClientRectangle
'Lineargradientbrush b in Form des Clientrechtecks mit den Farben c1 und c2 und dem Winkel m_Gradient
Dim b As New System.Drawing.Drawing2D.LinearGradientBrush(r, c1, c2, m_Gradient)
e.Graphics.FillRectangle(b, r)
'Hier wird noch einmal der CuteText ueber den Button gezeichnet, da der Original Button Text hinter dem Brush b verschwindet. Also wenn die Farben nicht transparent sind, ist der normale Button Text gar nicht lesbar. Style bestimmt die Position des CuteTextes.
e.Graphics.DrawString(m_Text, MyBase.Font, New SolidBrush(MyBase.ForeColor), r, style)
b.Dispose()
End Sub
End Class
Nun muss das Ganze noch über das Menü Erstellen, erstellt werden.
Die Zuweisung in die Toolbox dann über Rechtsklick in gewählter Unterkategorie -> Elemente auswählen -> unter .NET auf durchsuchen klicken -> hier nun die erstellte dll auswählen (unter bin/debug im Verzeichnis des Projektes) Sollte das Element in der Toolbox ausgegraut/nicht verfügbar sein, muss geprüft werden ob das Projekt in mindestens der gleichen Version (.Net Framework) ist, die auch zur Erstellung des Custom Controls verwendet worden ist. Einstellen lässt sich das über die Projekteingenschaften im Reiter Kompilieren. Hier muss der Dialog über den Button Erweiterte Kompilierungsoptionen aufgerufen werden,
Keine Kommentare:
Kommentar veröffentlichen