重画系列:双色Button

ganenpingsohucom(原作)  
关键字     Button

效果如下图:

img_1

比较简单,下面是源代码,新建一类库工程,拷贝以下源代码覆盖Class1,生成Dll文件就可以使用了

Public Class XpStyleButton
    Inherits System.Windows.Forms.UserControl

#Region " Windows 窗体设计器生成的代码 "

    Public Sub New()
        MyBase.New()

        '该调用是 Windows 窗体设计器所必需的。
        InitializeComponent()

        '在 InitializeComponent() 调用之后添加任何初始化
        setstyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.DoubleBuffer Or ControlStyles.UserPaint, True)
    End Sub

    'UserControl1 重写 dispose 以清理组件列表。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Windows 窗体设计器所必需的
    Private components As System.ComponentModel.IContainer

    '注意:以下过程是 Windows 窗体设计器所必需的
    '可以使用 Windows 窗体设计器修改此过程。
    '不要使用代码编辑器修改它。
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        '
        'XpStyleButton
        '
        Me.Name = "XpStyleButton"
        Me.Size = New System.Drawing.Size(264, 88)

    End Sub

#End Region
    Private IsMouseDown As Boolean = False
    Private xMagin As Integer = 2
    Private yMagin As Integer = 2
    Private m_BackColor As Color = Color.BurlyWood
    Private m_ForeColor As Color = Color.White
    Private m_Style As Style = Style.RectStyle
    'button's Styles
    Public Enum Style
        RectStyle = 0
        EllipseStyle = 1
        CircleStyle = 2
    End Enum

    '--------------------对外属性--------------
    '亮色
    Public Property LightColor() As Color
        Get
            Return m_ForeColor
        End Get
        Set(ByVal Value As Color)
            m_ForeColor = Value
        End Set
    End Property
    '暗色
    Public Property GrayColor() As Color
        Get
            Return Me.m_BackColor
        End Get
        Set(ByVal Value As Color)
            Me.m_BackColor = Value
        End Set
    End Property
    Public Property ButtonStyle() As Style
        Get
            Return Me.m_Style
        End Get
        Set(ByVal Value As Style)
            If Value = Style.CircleStyle Then
                Me.Height = Me.Width
            End If
            Me.m_Style = Value
        End Set
    End Property
    '在这里实现重画双色Button
    Private Sub XpStyleButton_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Me.BackColor = Me.Parent.BackColor
        Dim brush As Drawing.Drawing2D.LinearGradientBrush
        Dim brush1 As Drawing.Drawing2D.LinearGradientBrush
        brush = New Drawing.Drawing2D.LinearGradientBrush(New PointF(0, 0), New PointF(0, Me.Height), Me.m_ForeColor, Me.m_BackColor)
        '对鼠标单击响应
        If Me.IsMouseDown Then
            brush1 = New Drawing.Drawing2D.LinearGradientBrush(New PointF(xMagin, yMagin), New PointF(xMagin, Me.Height), Color.FromArgb(0, 255, 255, 255), Color.FromArgb(150, 255, 255, 255))
        Else
            brush1 = New Drawing.Drawing2D.LinearGradientBrush(New PointF(xMagin, yMagin), New PointF(xMagin, Me.Height / 2), Color.FromArgb(150, 255, 255, 255), Color.FromArgb(0, 255, 255, 255))
        End If
        brush.WrapMode = Drawing.Drawing2D.WrapMode.TileFlipX
        brush1.WrapMode = Drawing.Drawing2D.WrapMode.TileFlipX

        Dim rect As Rectangle = New Rectangle(0, 0, Me.Width - xMagin, Me.Height - yMagin)
        Dim rect1 As Rectangle = New Rectangle(xMagin, yMagin, Me.Width - 2 * xMagin, Me.Height / 2)
        Select Case Me.m_Style
            Case Style.RectStyle
                Me.DrawRectStyle(e.Graphics, rect, rect1, brush, brush1)
            Case Style.EllipseStyle
                Me.DrawEllipseStyle(e.Graphics, rect, rect1, brush, brush1)
            Case Style.CircleStyle
                Me.DrawEllipseStyle(e.Graphics, rect, rect1, brush, brush1)
            Case Else
                Me.DrawRectStyle(e.Graphics, rect, rect1, brush, brush1)
        End Select

    End Sub
    '画椭圆形按钮(圆型按钮也是由它重画)
    Private Sub DrawEllipseStyle(ByRef g As Graphics, ByVal rect As Rectangle, ByVal rect1 As Rectangle, ByVal bbrush As Brush, ByVal fbrush As Brush)
        g.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
        g.FillEllipse(bbrush, rect)
        g.FillEllipse(fbrush, rect)
        g.DrawEllipse(New Pen(m_BackColor), rect)
    End Sub
    '画矩形按钮
    Private Sub DrawRectStyle(ByRef g As Graphics, ByVal rect As Rectangle, ByVal rect1 As Rectangle, ByVal bbrush As Brush, ByVal fbrush As Brush)
        g.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
        g.FillRectangle(bbrush, rect)
        g.FillRectangle(fbrush, rect)
        g.DrawRectangle(New Pen(m_BackColor), rect)
    End Sub
    Private Sub XpStyleButton_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        IsMouseDown = True
        Me.Refresh()
    End Sub

    Private Sub XpStyleButton_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
        IsMouseDown = False
        Me.Refresh()
    End Sub

End Class

以下是测试的源代码,需要添加上面生成的Dll的引用:

Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows 窗体设计器生成的代码 "

    Public Sub New()
        MyBase.New()

        '该调用是 Windows 窗体设计器所必需的。
        InitializeComponent()

        '在 InitializeComponent() 调用之后添加任何初始化

    End Sub

    '窗体重写处置以清理组件列表。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub
    Private button1 As XPStyleButton.XpStyleButton
    'Windows 窗体设计器所必需的
    Private components As System.ComponentModel.IContainer

    '注意:以下过程是 Windows 窗体设计器所必需的
    '可以使用 Windows 窗体设计器修改此过程。
    '不要使用代码编辑器修改它。
    Friend WithEvents XpStyleButton1 As XPStyleButton.XpStyleButton
    Friend WithEvents XpStyleButton4 As XPStyleButton.XpStyleButton
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.button1 = New XPStyleButton.XpStyleButton()
        Me.XpStyleButton1 = New XPStyleButton.XpStyleButton()
        Me.XpStyleButton4 = New XPStyleButton.XpStyleButton()
        Me.SuspendLayout()
        '
        'button1
        '
        Me.button1.BackColor = System.Drawing.SystemColors.Control
        Me.button1.ButtonStyle = XPStyleButton.XpStyleButton.Style.RectStyle
        Me.button1.ForeColor = System.Drawing.Color.White
        Me.button1.GrayColor = System.Drawing.Color.FromArgb(CType(0, Byte), CType(192, Byte), CType(0, Byte))
        Me.button1.LightColor = System.Drawing.SystemColors.HighlightText
        Me.button1.Location = New System.Drawing.Point(56, 32)
        Me.button1.Name = "button1"
        Me.button1.Size = New System.Drawing.Size(88, 25)
        Me.button1.TabIndex = 0
        '
        'XpStyleButton1
        '
        Me.XpStyleButton1.BackColor = System.Drawing.SystemColors.Control
        Me.XpStyleButton1.ButtonStyle = XPStyleButton.XpStyleButton.Style.CircleStyle
        Me.XpStyleButton1.GrayColor = System.Drawing.Color.Blue
        Me.XpStyleButton1.LightColor = System.Drawing.Color.White
        Me.XpStyleButton1.Location = New System.Drawing.Point(280, 24)
        Me.XpStyleButton1.Name = "XpStyleButton1"
        Me.XpStyleButton1.Size = New System.Drawing.Size(104, 64)
        Me.XpStyleButton1.TabIndex = 1
        '
        'XpStyleButton4
        '
        Me.XpStyleButton4.BackColor = System.Drawing.SystemColors.Control
        Me.XpStyleButton4.ButtonStyle = XPStyleButton.XpStyleButton.Style.CircleStyle
        Me.XpStyleButton4.GrayColor = System.Drawing.Color.BurlyWood
        Me.XpStyleButton4.LightColor = System.Drawing.Color.White
        Me.XpStyleButton4.Location = New System.Drawing.Point(168, 16)
        Me.XpStyleButton4.Name = "XpStyleButton4"
        Me.XpStyleButton4.Size = New System.Drawing.Size(96, 96)
        Me.XpStyleButton4.TabIndex = 2
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
        Me.ClientSize = New System.Drawing.Size(520, 273)
        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.button1, Me.XpStyleButton4, Me.XpStyleButton1})
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

#End Region

End Class

谢谢阅读,希望有什么意见能和我联系,ganenping@mainone.com.cn qq: 44460100

Contributors: FHL