Класс кнопки в vb.net - PullRequest
       55

Класс кнопки в vb.net

0 голосов
/ 07 октября 2019

Я пытаюсь создать класс для управления кнопками, унаследовав свойство кнопки. Я хочу добавить еще свойство в свойство по умолчанию, создав новый класс кнопки

. Первоначально новое свойство будет выглядеть следующим образом: 1) Цвет снизу и сверху 2) Круглый угол

См. Код ниже

'Ниже приведен код, который я пробовал

 Class MyButton
    Inherits Button

    Public Property TopColor As Color
    Public Property BottomColor As Color

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        Dim lgb As LinearGradientBrush = New 
          LinearGradientBrush(Me.ClientRectangle, Me.TopColor, 
          Me.BottomColor, 90.0F)
        Dim g As Graphics = e.Graphics
        g.FillRectangle(lgb, Me.ClientRectangle)
        MyBase.OnPaint(e)
    End Sub
End Class

Когда я назначаю цвет для свойства Top и Bottom Color, цвет bottom не меняется. Даже я не получаю сообщение об ошибке

1 Ответ

0 голосов
/ 07 октября 2019

Вам просто нужно использовать установщик свойств (и, конечно, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...