重画系列:双色Button
ganenpingsohucom(原作)
关键字 Button
效果如下图:
比较简单,下面是源代码,新建一类库工程,拷贝以下源代码覆盖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