Вам просто нужно использовать установщик свойств (и, конечно, Getter), чтобы вы могли вызывать Invalidate () при изменении значения свойства. Это вызывает событие Paint
, в результате чего элемент управления перерисовывается сам.
Код в методе OnPaint
перерисовывает графику кнопки с использованием новых цветов.
Вам также нужно нарисовать текст кнопки, так как он удаляется, когда мы рисуем содержимое кнопки.
Это также означает, что мы рассматриваем свойство TextAlign
, чтобы перерисовать текств правильном положении.
Я использую StrinFormat здесь, чтобы выровнять текст, как определено свойством TextAlign
кнопки.
См. GetVerticalAlignment()
и GetHorizontalAlignment()
методы.
Наконец, что не менее важно, кисти «Фон» и «Передний план» должны быть удалены, чтобы избежать утечки графического ресурса. То же самое относится и к объекту StringFormat
.
Нам просто нужно объявить эти объекты с помощью с помощью операторов и использовать их внутри блоков Using
.
Это позаботится об удалении этих объектов, когдамы закончили с ними.
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms
Class MyButton
Inherits Button
Private m_TopColor As Color = Color.LightGreen
Private m_BottomColor As Color = Color.Orange
Public Property TopColor As Color
Get
Return m_TopColor
End Get
Set(ByVal value As Color)
m_TopColor = value
Me.Invalidate()
End Set
End Property
Public Property BottomColor As Color
Get
Return m_BottomColor
End Get
Set(ByVal value As Color)
m_BottomColor = value
Me.Invalidate()
End Set
End Property
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
Using lgb As LinearGradientBrush = New LinearGradientBrush(Me.ClientRectangle, m_TopColor, m_BottomColor, 90.0F)
Using textBrush As SolidBrush = New SolidBrush(Me.ForeColor)
Using format As StringFormat = New StringFormat()
format.Alignment = GetHorizontalAlignment()
format.LineAlignment = GetVerticalAlignment()
e.Graphics.FillRectangle(lgb, Me.ClientRectangle)
e.Graphics.DrawString(Me.Text, Me.Font, textBrush, Me.ClientRectangle, format)
End Using
End Using
End Using
End Sub
Private Function GetVerticalAlignment() As StringAlignment
Return CType(Math.Log(Me.TextAlign, 2D) / 4, StringAlignment)
End Function
Private Function GetHorizontalAlignment() As StringAlignment
Return CType(Math.Log(Me.TextAlign, 2D) Mod 4, StringAlignment)
End Function
End Class