重画系列:双色Button

原创 2004年02月10日 12:22:00

效果如下图:

比较简单,下面是源代码,新建一类库工程,拷贝以下源代码覆盖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

《Node.js实战(双色)》作者之一——吴中骅访谈录

1 请和大家介绍下您及所从事的工作。 我目前在苏州唐人数码工作,是一家本地的网络游戏公司,主要经营棋牌游戏,最近自主研发了一款3D的网路游戏——争渡三国,我在公司负责游戏平台工作,对公司自营的游戏以...
  • broadview2006
  • broadview2006
  • 2014年05月14日 09:24
  • 4058

Arduino学习(四) 双色LED实验

双色LED是一种可以显示二色颜色的LED灯,  可以有三种状态:  灭,  颜色1亮, 颜色2亮 .  根据颜色组合的不同,  分为红蓝双色,  黄蓝双色, 红绿双色等等. 双色LED是一种常用的L...
  • c80486
  • c80486
  • 2016年09月23日 00:01
  • 2386

MFC控件的自主重画处理

MFC窗口消息的处理过程包含两个部分,父窗口和子窗口的处理。父窗口作为
  • dayenglish
  • dayenglish
  • 2014年11月01日 21:37
  • 904

南邮 OJ 1217 双色Hanoi塔问题

双色Hanoi塔问题 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 58            测试...
  • changshu1
  • changshu1
  • 2015年08月05日 11:10
  • 574

双色汉诺塔问题

//双色汉诺塔问题 #include using namespace std; int removeTimes = 0; void hanoiorignal(int nmovnum, char cz...
  • firechungelaile
  • firechungelaile
  • 2014年09月29日 22:19
  • 2267

双色Hanoi塔问题

双色Hanoi塔问题 【问题描述】       设A、B、C是3 个塔座。开始时,在塔座A 上有一叠共n 个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,……,n...
  • clover_hxy
  • clover_hxy
  • 2015年12月04日 19:19
  • 1653

Android-自定义反色圆角Button

学习目标:                 掌握使用 标签和 标签 在 Button 视图上的使用。                 掌握使用代码代替xml文件的功能,实现同上效果。       ...
  • u010086540
  • u010086540
  • 2015年09月02日 17:52
  • 1221

Qt重画标题栏

1.      在头文件中添加下列三个函数 //鼠标点击标题栏,重新实现拖动操作 void mouseMoveEvent(QMouseEvent*event); void mousePressEven...
  • yinyuchen1
  • yinyuchen1
  • 2017年07月13日 22:16
  • 161

双摄像头深度剖析 (1):双Camera都能做什么?

双Camera科普之一:双Camera都能做什么?   这两年手机的亮点越来越少,高端智能机现在基本都不再去比拼雷兔兔,而开始PK拍照性能。于是乎,这两年各家纷纷开始做起了双Camera。   ...
  • pakaco
  • pakaco
  • 2017年02月08日 13:26
  • 578

.Algorithm Gossip (12) 双色、三色河内塔

Algorithm Gossip: 双色、三色河内塔 python/C++ 解答。
  • actanble
  • actanble
  • 2017年04月13日 20:32
  • 359
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重画系列:双色Button
举报原因:
原因补充:

(最多只允许输入30个字)