C#开发软件这个按钮如何变成这样?写什么样式..
是软件 不是网页
左边的变成右边的

解决方案 »

  1.   


    Imports System.Collections.Generic
    Imports System.Text
    Imports System.Windows.Forms
    Imports System.Drawing
    Imports System.Drawing.Drawing2D
    Imports System.ComponentModelPublic Class buttonEx
        Inherits Button
        Private _baseColor As Color = Color.FromArgb(160, 199, 223)
        Private _controlState As ControlState
        Private _imageWidth As Integer = 18
        Private _roundStyle As RoundStyle = RoundStyle.All
        Private _radius As Integer = 8    Public Sub New()
            MyBase.New()
            SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.OptimizedDoubleBuffer Or ControlStyles.ResizeRedraw Or ControlStyles.SupportsTransparentBackColor, True)
        End Sub    <DefaultValue(GetType(Color), "160, 199, 223")> _
        Public Property BaseColor() As Color
            Get
                Return _baseColor
            End Get
            Set(ByVal value As Color)
                _baseColor = value
                MyBase.Invalidate()
            End Set
        End Property    <DefaultValue(18)> _
        Public Property ImageWidth() As Integer
            Get
                Return _imageWidth
            End Get
            Set(ByVal value As Integer)
                If Value <> _imageWidth Then                _imageWidth = If(Value < 12, 12, Value)
                    MyBase.Invalidate()
                End If
            End Set
        End Property    <DefaultValue(GetType(RoundStyle), "1")> _
        Public Property RoundStyle() As RoundStyle
            Get
                Return _roundStyle
            End Get
            Set(ByVal value As RoundStyle)
                If _roundStyle <> Value Then
                    _roundStyle = Value
                    MyBase.Invalidate()
                End If
            End Set
        End Property    <DefaultValue(8)> _
        Public Property Radius() As Integer
            Get
                Return _radius
            End Get
            Set(ByVal value As Integer)
                If _radius <> Value Then
                    _radius = If(Value < 4, 4, Value)
                    MyBase.Invalidate()
                End If
            End Set
        End Property    Friend Property ControlState() As ControlState
            Get
                Return _controlState
            End Get
            Set(ByVal value As ControlState)
                If _controlState <> Value Then
                    _controlState = Value
                    MyBase.Invalidate()
                End If
            End Set
        End Property    Protected Overrides Sub OnMouseEnter(ByVal e As EventArgs)
            MyBase.OnMouseEnter(e)
            ControlState = ControlState.Hover
        End Sub    Protected Overrides Sub OnMouseLeave(ByVal e As EventArgs)
            MyBase.OnMouseLeave(e)
            ControlState = ControlState.Normal
        End Sub    Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
            MyBase.OnMouseDown(e)
            If e.Button = MouseButtons.Left AndAlso e.Clicks = 1 Then
                ControlState = ControlState.Pressed
            End If
        End Sub    Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
            MyBase.OnMouseUp(e)
            If e.Button = MouseButtons.Left AndAlso e.Clicks = 1 Then
                If ClientRectangle.Contains(e.Location) Then
                    ControlState = ControlState.Hover
                Else
                    ControlState = ControlState.Normal
                End If
            End If
        End Sub    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
            MyBase.OnPaint(e)
            MyBase.OnPaintBackground(e)        Dim g As Graphics = e.Graphics
            Dim imageRect As Rectangle
            Dim textRect As Rectangle        CalculateRect(imageRect, textRect)
            g.SmoothingMode = SmoothingMode.AntiAlias        Dim baseColor As Color
            Dim borderColor As Color
            Dim innerBorderColor As Color = Color.FromArgb(200, 255, 255, 255)        If Enabled Then
                Select Case ControlState
                    Case ControlState.Hover
                        baseColor = GetColor(_baseColor, 0, -13, -8, -3)
                        borderColor = _baseColor
                        Exit Select
                    Case ControlState.Pressed
                        baseColor = GetColor(_baseColor, 0, -35, -24, -9)
                        borderColor = _baseColor
                        Exit Select
                    Case Else
                        baseColor = _baseColor
                        borderColor = _baseColor
                        Exit Select
                End Select
            Else
                '禁用背景和边框颜色
                baseColor = Color.FromArgb(255, 255, 255)
                borderColor = Color.FromArgb(56, 134, 207)
            End If        RenderBackgroundInternal(g, ClientRectangle, baseColor, borderColor, innerBorderColor, RoundStyle, _
             Radius, 0.35F, True, True, LinearGradientMode.Vertical)        If Image IsNot Nothing Then
                g.InterpolationMode = InterpolationMode.HighQualityBilinear
                g.DrawImage(Image, imageRect, 0, 0, Image.Width, Image.Height, _
                 GraphicsUnit.Pixel)
            End If        TextRenderer.DrawText(g, Text, Font, textRect, ForeColor, GetTextFormatFlags(TextAlign, RightToLeft = RightToLeft.Yes))
        End Sub    Private Sub CalculateRect(ByRef imageRect As Rectangle, ByRef textRect As Rectangle)
            imageRect = Rectangle.Empty
            textRect = Rectangle.Empty
            If Image Is Nothing Then
                textRect = New Rectangle(2, 0, Width - 4, Height)
                Return
            End If
            Select Case TextImageRelation
                Case TextImageRelation.Overlay
                    imageRect = New Rectangle(2, (Height - ImageWidth) \ 2, ImageWidth, ImageWidth)
                    textRect = New Rectangle(2, 0, Width - 4, Height)
                    Exit Select
                Case TextImageRelation.ImageAboveText
                    imageRect = New Rectangle((Width - ImageWidth) \ 2, 2, ImageWidth, ImageWidth)
                    textRect = New Rectangle(2, imageRect.Bottom, Width, Height - imageRect.Bottom - 2)
                    Exit Select
                Case TextImageRelation.ImageBeforeText
                    imageRect = New Rectangle(2, (Height - ImageWidth) \ 2, ImageWidth, ImageWidth)
                    textRect = New Rectangle(imageRect.Right + 2, 0, Width - imageRect.Right - 4, Height)
                    Exit Select
                Case TextImageRelation.TextAboveImage
                    imageRect = New Rectangle((Width - ImageWidth) \ 2, Height - ImageWidth - 2, ImageWidth, ImageWidth)
                    textRect = New Rectangle(0, 2, Width, Height - imageRect.Y - 2)
                    Exit Select
                Case TextImageRelation.TextBeforeImage
                    imageRect = New Rectangle(Width - ImageWidth - 2, (Height - ImageWidth) \ 2, ImageWidth, ImageWidth)
                    textRect = New Rectangle(2, 0, imageRect.X - 2, Height)
                    Exit Select
            End Select        If RightToLeft = RightToLeft.Yes Then
                imageRect.X = Width - imageRect.Right
                textRect.X = Width - textRect.Right
            End If
        End Sub
      

  2.   


        Friend Sub RenderBackgroundInternal(ByVal g As Graphics, ByVal rect As Rectangle, ByVal baseColor As Color, ByVal borderColor As Color, ByVal innerBorderColor As Color, ByVal style As RoundStyle, _
         ByVal roundWidth As Integer, ByVal basePosition As Single, ByVal drawBorder As Boolean, ByVal drawGlass__1 As Boolean, ByVal mode As LinearGradientMode)
            If drawBorder Then
                rect.Width -= 1
                rect.Height -= 1
            End If        Using brush As New LinearGradientBrush(rect, Color.Transparent, Color.Transparent, mode)
                Dim colors As Color() = New Color(3) {}
                colors(0) = GetColor(baseColor, 0, 35, 24, 9)
                colors(1) = GetColor(baseColor, 0, 13, 8, 3)
                colors(2) = baseColor
                colors(3) = GetColor(baseColor, 0, 68, 69, 54)            Dim blend As New ColorBlend()
                blend.Positions = New Single() {0.0F, basePosition, basePosition + 0.05F, 1.0F}
                blend.Colors = colors
                brush.InterpolationColors = blend
                If style <> RoundStyle.None Then
                    Using path As GraphicsPath = GraphicsPathHelper.CreatePath(rect, roundWidth, style, False)
                        g.FillPath(brush, path)
                    End Using                If baseColor.A > 80 Then
                        Dim rectTop As Rectangle = rect                    If mode = LinearGradientMode.Vertical Then
                            rectTop.Height = CInt(Math.Truncate(rectTop.Height * basePosition))
                        Else
                            rectTop.Width = CInt(Math.Truncate(rect.Width * basePosition))
                        End If
                        Using pathTop As GraphicsPath = GraphicsPathHelper.CreatePath(rectTop, roundWidth, RoundStyle.Top, False)
                            Using brushAlpha As New SolidBrush(Color.FromArgb(80, 255, 255, 255))
                                g.FillPath(brushAlpha, pathTop)
                            End Using
                        End Using
                    End If                If drawGlass__1 Then
                        Dim glassRect As RectangleF = rect
                        If mode = LinearGradientMode.Vertical Then
                            glassRect.Y = rect.Y + rect.Height * basePosition
                            glassRect.Height = (rect.Height - rect.Height * basePosition) * 2
                        Else
                            glassRect.X = rect.X + rect.Width * basePosition
                            glassRect.Width = (rect.Width - rect.Width * basePosition) * 2
                        End If
                        DrawGlass(g, glassRect, 170, 0)
                    End If                If drawBorder Then
                        Using path As GraphicsPath = GraphicsPathHelper.CreatePath(rect, roundWidth, style, False)
                            Using pen As New Pen(borderColor)
                                g.DrawPath(pen, path)
                            End Using
                        End Using                    rect.Inflate(-1, -1)
                        Using path As GraphicsPath = GraphicsPathHelper.CreatePath(rect, roundWidth, style, False)
                            Using pen As New Pen(innerBorderColor)
                                g.DrawPath(pen, path)
                            End Using
                        End Using
                    End If
                Else
                    g.FillRectangle(brush, rect)
                    If baseColor.A > 80 Then
                        Dim rectTop As Rectangle = rect
                        If mode = LinearGradientMode.Vertical Then
                            rectTop.Height = CInt(Math.Truncate(rectTop.Height * basePosition))
                        Else
                            rectTop.Width = CInt(Math.Truncate(rect.Width * basePosition))
                        End If
                        Using brushAlpha As New SolidBrush(Color.FromArgb(80, 255, 255, 255))
                            g.FillRectangle(brushAlpha, rectTop)
                        End Using
                    End If                If drawGlass__1 Then
                        Dim glassRect As RectangleF = rect
                        If mode = LinearGradientMode.Vertical Then
                            glassRect.Y = rect.Y + rect.Height * basePosition
                            glassRect.Height = (rect.Height - rect.Height * basePosition) * 2
                        Else
                            glassRect.X = rect.X + rect.Width * basePosition
                            glassRect.Width = (rect.Width - rect.Width * basePosition) * 2
                        End If
                        DrawGlass(g, glassRect, 200, 0)
                    End If                If drawBorder Then
                        Using pen As New Pen(borderColor)
                            g.DrawRectangle(pen, rect)
                        End Using                    rect.Inflate(-1, -1)
                        Using pen As New Pen(innerBorderColor)
                            g.DrawRectangle(pen, rect)
                        End Using
                    End If
                End If
            End Using
        End Sub    Private Sub DrawGlass(ByVal g As Graphics, ByVal glassRect As RectangleF, ByVal alphaCenter As Integer, ByVal alphaSurround As Integer)
            DrawGlass(g, glassRect, Color.White, alphaCenter, alphaSurround)
        End Sub    Private Sub DrawGlass(ByVal g As Graphics, ByVal glassRect As RectangleF, ByVal glassColor As Color, ByVal alphaCenter As Integer, ByVal alphaSurround As Integer)
            Using path As New GraphicsPath()
                path.AddEllipse(glassRect)
                Using brush As New PathGradientBrush(path)
                    brush.CenterColor = Color.FromArgb(alphaCenter, glassColor)
                    brush.SurroundColors = New Color() {Color.FromArgb(alphaSurround, glassColor)}
                    brush.CenterPoint = New PointF(glassRect.X + glassRect.Width / 2, glassRect.Y + glassRect.Height / 2)
                    g.FillPath(brush, path)
                End Using
            End Using
        End Sub    Private Function GetColor(ByVal colorBase As Color, ByVal a As Integer, ByVal r As Integer, ByVal g As Integer, ByVal b As Integer) As Color
            Dim a0 As Integer = colorBase.A
            Dim r0 As Integer = colorBase.R
            Dim g0 As Integer = colorBase.G
            Dim b0 As Integer = colorBase.B        If a + a0 > 255 Then
                a = 255
            Else
                a = Math.Max(a + a0, 0)
            End If
            If r + r0 > 255 Then
                r = 255
            Else
                r = Math.Max(r + r0, 0)
            End If
            If g + g0 > 255 Then
                g = 255
            Else
                g = Math.Max(g + g0, 0)
            End If
            If b + b0 > 255 Then
                b = 255
            Else
                b = Math.Max(b + b0, 0)
            End If        Return Color.FromArgb(a, r, g, b)
        End Function    Friend Shared Function GetTextFormatFlags(ByVal alignment As ContentAlignment, ByVal rightToleft As Boolean) As TextFormatFlags
            Dim flags As TextFormatFlags = TextFormatFlags.WordBreak Or TextFormatFlags.SingleLine
            If rightToleft Then
                flags = flags Or TextFormatFlags.RightToLeft Or TextFormatFlags.Right
            End If        Select Case alignment
                Case ContentAlignment.BottomCenter
                    flags = flags Or TextFormatFlags.Bottom Or TextFormatFlags.HorizontalCenter
                    Exit Select
                Case ContentAlignment.BottomLeft
                    flags = flags Or TextFormatFlags.Bottom Or TextFormatFlags.Left
                    Exit Select
                Case ContentAlignment.BottomRight
                    flags = flags Or TextFormatFlags.Bottom Or TextFormatFlags.Right
                    Exit Select
                Case ContentAlignment.MiddleCenter
                    flags = flags Or TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter
                    Exit Select
                Case ContentAlignment.MiddleLeft
                    flags = flags Or TextFormatFlags.VerticalCenter Or TextFormatFlags.Left
                    Exit Select
                Case ContentAlignment.MiddleRight
                    flags = flags Or TextFormatFlags.VerticalCenter Or TextFormatFlags.Right
                    Exit Select
                Case ContentAlignment.TopCenter
                    flags = flags Or TextFormatFlags.Top Or TextFormatFlags.HorizontalCenter
                    Exit Select
                Case ContentAlignment.TopLeft
                    flags = flags Or TextFormatFlags.Top Or TextFormatFlags.Left
                    Exit Select
                Case ContentAlignment.TopRight
                    flags = flags Or TextFormatFlags.Top Or TextFormatFlags.Right
                    Exit Select
            End Select
            Return flags
        End Function
    End Class
      

  3.   

    注释掉program.cs的Main方法的
    Application.EnableVisualStyles