Закругленный столбец в пользовательском элементе управления Button - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь создать класс для пользовательского управления кнопками, который будет иметь 2 верхних и нижних цвета с закругленными углами. Ниже приведен код, который дает мне два градиента цвета сверху и снизу. Тем не менее, я столкнулся с некоторой проблемой, связанной с этим, когда свойство наведения мыши не работает и изображение также не отображается (так как новые ингредиенты перекрывают текст кнопки и изображение, скрытое за цветом фона ингредиентов)

Можеткто-нибудь помочь мне с этим элементом управления, где все элементы управления должны работать так же, как они работают с управлением кнопками Windows в дополнение к цвету градиента и закругленным углам?

Пожалуйста, дайте мне знать, если вам потребуется дополнительная информация.

Заранее спасибо.

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

1 Ответ

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

настроить закругленную кнопку, код:

Imports System.Drawing.Drawing2D


    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

        Public Sub New()
            FlatStyle = FlatStyle.Flat
            FlatAppearance.BorderSize = 0
            FlatAppearance.BorderColor = Color.FromArgb(0, 0, 0, 0)
            FlatAppearance.MouseDownBackColor = Color.Transparent
            FlatAppearance.MouseOverBackColor = Color.Transparent
            BackColor = Color.Transparent
            Me.BackgroundImageLayout = ImageLayout.Zoom

            AddHandler Me.MouseMove, AddressOf MyMouseMove
            AddHandler Me.MouseLeave, AddressOf MyMouseLeave

        End Sub
        Private Sub MyMouseLeave(ByVal sender As Object, ByVal e As EventArgs)

        End Sub

        Private Sub MyMouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)

        End Sub

        Private Sub Draw(ByVal rectangle As Rectangle, ByVal g As Graphics, ByVal cusp As Boolean)

            Dim span As Integer = 2
            g.SmoothingMode = SmoothingMode.AntiAlias
            Dim myLinearGradientBrush As LinearGradientBrush = New LinearGradientBrush(Me.ClientRectangle, m_TopColor, m_BottomColor, 90.0F)


            g.FillPath(myLinearGradientBrush, DrawRoundRect(rectangle.X, rectangle.Y, rectangle.Width - span, rectangle.Height - 1, 20))
        End Sub
        Private Function DrawRoundRect(ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal radius As Integer) As GraphicsPath
            Dim gp As GraphicsPath = New GraphicsPath()
            gp.AddArc(x, y, radius, radius, 180, 90)
            gp.AddArc(width - radius, y, radius, radius, 270, 90)
            gp.AddArc(width - radius, height - radius, radius, radius, 0, 90)
            gp.AddArc(x, height - radius, radius, radius, 90, 90)
            gp.CloseAllFigures()
            Return gp
        End Function

        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
            MyBase.OnPaint(e)

            Draw(e.ClipRectangle, e.Graphics, False)

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