类QQ的XP BUTTON控件

类别:.NET开发 点击:0 评论:0 推荐:

Imports System
Imports System.Enum
Imports System.Collections
Imports System.ComponentModel
Imports System.Drawing
Imports System.Data
Imports System.Windows.Forms
Imports System.Drawing.Drawing2D
Imports System.Drawing.Design

Namespace LandlordAspx_xpctrl

    Public Class emunType

        Public Enum XPStyle
            Default1
            Blue
            OliveGreen
            Silver
        End Enum

        Public Enum BtnShape
            Rectangle
            Ellipse
        End Enum
    End Class

    Friend NotInheritable Class ControlPaint

        Private Sub New()
        End Sub

        Public Shared ReadOnly Property BorderColor() As Color
            Get
                Return Color.FromArgb(127, 157, 185)
            End Get
        End Property

        Public Shared ReadOnly Property DisabledBorderColor() As Color
            Get
                Return Color.FromArgb(201, 199, 186)
            End Get
        End Property

        Public Shared ReadOnly Property ButtonBorderColor() As Color
            Get
                Return Color.FromArgb(28, 81, 128)
            End Get
        End Property

        Public Shared ReadOnly Property DisabledButtonBorderColor() As Color
            Get
                Return Color.FromArgb(202, 200, 187)
            End Get
        End Property

        Public Shared ReadOnly Property DisabledBackColor() As Color
            Get
                Return Color.FromArgb(236, 233, 216)
            End Get
        End Property

        Public Shared ReadOnly Property DisabledForeColor() As Color
            Get
                Return Color.FromArgb(161, 161, 146)
            End Get
        End Property


        Public Shared Function GetStringFormat(ByVal contentAlignment As ContentAlignment) As StringFormat
            If Not System.Enum.IsDefined(GetType(ContentAlignment), CType(contentAlignment, Integer)) Then
                Throw New System.ComponentModel.InvalidEnumArgumentException("contentAlignment", CType(contentAlignment, Integer), GetType(ContentAlignment))
            End If
            Dim stringFormat As StringFormat = New StringFormat
            Select Case contentAlignment
                Case contentAlignment.MiddleCenter
                    stringFormat.LineAlignment = StringAlignment.Center
                    stringFormat.Alignment = StringAlignment.Center
                    ' break
                Case contentAlignment.MiddleLeft
                    stringFormat.LineAlignment = StringAlignment.Center
                    stringFormat.Alignment = StringAlignment.Near
                    ' break
                Case contentAlignment.MiddleRight
                    stringFormat.LineAlignment = StringAlignment.Center
                    stringFormat.Alignment = StringAlignment.Far
                    ' break
                Case contentAlignment.TopCenter
                    stringFormat.LineAlignment = StringAlignment.Near
                    stringFormat.Alignment = StringAlignment.Center
                    ' break
                Case contentAlignment.TopLeft
                    stringFormat.LineAlignment = StringAlignment.Near
                    stringFormat.Alignment = StringAlignment.Near
                    ' break
                Case contentAlignment.TopRight
                    stringFormat.LineAlignment = StringAlignment.Near
                    stringFormat.Alignment = StringAlignment.Far
                    ' break
                Case contentAlignment.BottomCenter
                    stringFormat.LineAlignment = StringAlignment.Far
                    stringFormat.Alignment = StringAlignment.Center
                    ' break
                Case contentAlignment.BottomLeft
                    stringFormat.LineAlignment = StringAlignment.Far
                    stringFormat.Alignment = StringAlignment.Near
                    ' break
                Case contentAlignment.BottomRight
                    stringFormat.LineAlignment = StringAlignment.Far
                    stringFormat.Alignment = StringAlignment.Far
                    ' break
            End Select
            Return stringFormat
        End Function

        Public Shared Sub DrawRoundedRectangle(ByVal g As Graphics, ByVal p As Pen, ByVal rc As Rectangle, ByVal size As Size)
            Dim oldSmoothingMode As SmoothingMode = g.SmoothingMode
            g.SmoothingMode = SmoothingMode.AntiAlias
            g.DrawLine(p, CType(rc.Left + size.Width / 2, Single), rc.Top, CType(rc.Right - size.Width / 2, Single), rc.Top)
            g.DrawArc(p, rc.Right - size.Width, rc.Top, size.Width, size.Height, 270, 90)
            g.DrawLine(p, rc.Right, CType(rc.Top + size.Height / 2, Single), rc.Right, CType(rc.Bottom - size.Height / 2, Single))
            g.DrawArc(p, rc.Right - size.Width, rc.Bottom - size.Height, size.Width, size.Height, 0, 90)
            g.DrawLine(p, CType(rc.Right - size.Width / 2, Single), rc.Bottom, CType(rc.Left + size.Width / 2, Single), rc.Bottom)
            g.DrawArc(p, rc.Left, rc.Bottom - size.Height, size.Width, size.Height, 90, 90)
            g.DrawLine(p, rc.Left, CType(rc.Bottom - size.Height / 2, Single), rc.Left, CType(rc.Top + size.Height / 2, Single))
            g.DrawArc(p, rc.Left, rc.Top, size.Width, size.Height, 180, 90)
            g.SmoothingMode = oldSmoothingMode
        End Sub

        Public Shared Sub DrawBorder(ByVal g As Graphics, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer)
            g.DrawRectangle(New Pen(ControlPaint.BorderColor, 0), x, y, width, height)
        End Sub

        Public Shared Sub EraseExcessOldDropDown(ByVal g As Graphics, ByVal newButton As Rectangle)
            g.FillRectangle(New SolidBrush(SystemColors.Window), newButton.X - 2, newButton.Y, 2, newButton.Height + 1)
        End Sub
    End Class

    Public Class XP_Button
        Inherits System.Windows.Forms.Button

        Public Enum ControlState
            Normal
            Hover
            Pressed
            Default1
            Disabled
        End Enum

        Private components As System.ComponentModel.Container

        Public Sub New()
            MyBase.New()

            InitializeComponent()

            Me.SetStyle(ControlStyles.UserPaint Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.DoubleBuffer, True)

        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

        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
            '
            'XPButton
            '
            Me.Name = "XPButton"

        End Sub


#Region "Static members"

        Private Shared ReadOnly sizeBorderPixelIndent As Size = New Size(4, 4)
        Dim clrOuterShadow1 As Color = Color.FromArgb(64, 164, 164, 164)
        Dim clrOuterShadow2 As Color = Color.FromArgb(64, Color.White)
        Dim clrBackground1 As Color = Color.FromArgb(250, 250, 248)
        Dim clrBackground2 As Color = Color.FromArgb(240, 240, 234)
        Dim clrBorder As Color = Color.FromArgb(0, 60, 116)
        Dim clrInnerShadowBottom1 As Color = Color.FromArgb(236, 235, 230)
        Dim clrInnerShadowBottom2 As Color = Color.FromArgb(226, 223, 214)
        Dim clrInnerShadowBottom3 As Color = Color.FromArgb(214, 208, 197)
        Dim clrInnerShadowRight1a As Color = Color.FromArgb(128, 236, 234, 230)
        Dim clrInnerShadowRight1b As Color = Color.FromArgb(128, 224, 220, 212)
        Dim clrInnerShadowRight2a As Color = Color.FromArgb(128, 234, 228, 218)
        Dim clrInnerShadowRight2b As Color = Color.FromArgb(128, 212, 208, 196)
        Dim clrInnerShadowBottomPressed1 As Color = Color.FromArgb(234, 233, 227)
        Dim clrInnerShadowBottomPressed2 As Color = Color.FromArgb(242, 241, 238)
        Dim clrInnerShadowTopPressed1 As Color = Color.FromArgb(209, 204, 193)
        Dim clrInnerShadowTopPressed2 As Color = Color.FromArgb(220, 216, 207)
        Dim clrInnerShadowLeftPressed1 As Color = Color.FromArgb(216, 213, 203)
        Dim clrInnerShadowLeftPressed2 As Color = Color.FromArgb(222, 220, 211)

#End Region

#Region "Constructors"
        'Shared EDButton()
        'sizeBorderPixelIndent = New Size(4, 4)
        'clrOuterShadow1 = Color.FromArgb(64, 164, 164, 164)
        'clrOuterShadow2 = Color.FromArgb(64, Color.White)
        'clrBackground1 = Color.FromArgb(250, 250, 248)
        'clrBackground2 = Color.FromArgb(240, 240, 234)
        'clrBorder = Color.FromArgb(0, 60, 116)
        ' clrInnerShadowBottom1 = Color.FromArgb(236, 235, 230)
        'clrInnerShadowBottom2 = Color.FromArgb(226, 223, 214)
        'clrInnerShadowBottom3 = Color.FromArgb(214, 208, 197)
        'clrInnerShadowRight1a = Color.FromArgb(128, 236, 234, 230)
        'clrInnerShadowRight1b = Color.FromArgb(128, 224, 220, 212)
        'clrInnerShadowRight2a = Color.FromArgb(128, 234, 228, 218)
        ' clrInnerShadowRight2b = Color.FromArgb(128, 212, 208, 196)
        ' clrInnerShadowBottomPressed1 = Color.FromArgb(234, 233, 227)
        'clrInnerShadowBottomPressed2 = Color.FromArgb(242, 241, 238)
        'clrInnerShadowTopPressed1 = Color.FromArgb(209, 204, 193)
        'clrInnerShadowTopPressed2 = Color.FromArgb(220, 216, 207)
        '  clrInnerShadowLeftPressed1 = Color.FromArgb(216, 213, 203)
        'clrInnerShadowLeftPressed2 = Color.FromArgb(222, 220, 211)
        'End Sub
#End Region

#Region "Properties"
        Dim enmState As ControlState = ControlState.Normal
        Dim bCanClick As Boolean = False
        Dim m_btnStyle As emunType.XPStyle = emunType.XPStyle.Default1
        Dim m_btnShape As emunType.BtnShape = emunType.BtnShape.Rectangle
        Dim locPoint As Point

        Public Shadows Property FlatStyle() As FlatStyle
            Get
                Return MyBase.FlatStyle
            End Get
            Set(ByVal Value As FlatStyle)
                MyBase.FlatStyle = FlatStyle.Standard
            End Set
        End Property

        Public Property BtnShape() As emunType.BtnShape
            Get
                Return m_btnShape
            End Get
            Set(ByVal Value As emunType.BtnShape)
                m_btnShape = Value
                MyBase.Invalidate()
            End Set
        End Property

        <DefaultValue("Blue"), System.ComponentModel.RefreshProperties(RefreshProperties.Repaint)> _
        Public Property BtnStyle() As emunType.XPStyle
            Get
                Return m_btnStyle
            End Get
            Set(ByVal Value As emunType.XPStyle)
                m_btnStyle = Value
                Me.Invalidate()
            End Set
        End Property

        Public Property AdjustImageLocation() As Point
            Get
                Return locPoint
            End Get
            Set(ByVal Value As Point)
                locPoint = Value
                Me.Invalidate()
            End Set
        End Property

        Private ReadOnly Property BorderRectangle() As Rectangle
            Get
                Dim rc As Rectangle = Me.ClientRectangle
                Return New Rectangle(1, 1, rc.Width - 3, rc.Height - 3)
            End Get
        End Property

#End Region

#Region "Methods"

        Protected Overloads Overrides Sub OnClick(ByVal ea As EventArgs)
            Me.Capture = False
            bCanClick = False
            If Me.ClientRectangle.Contains(Me.PointToClient(Control.MousePosition)) Then
                enmState = ControlState.Hover
            Else
                enmState = ControlState.Normal
            End If
            Me.Invalidate()
            MyBase.OnClick(ea)
        End Sub

        Protected Overloads Overrides Sub OnMouseEnter(ByVal ea As EventArgs)
            MyBase.OnMouseEnter(ea)
            enmState = ControlState.Hover
            Me.Invalidate()
        End Sub

        Protected Overloads Overrides Sub OnMouseDown(ByVal mea As MouseEventArgs)
            MyBase.OnMouseDown(mea)
            If mea.Button = MouseButtons.Left Then
                bCanClick = True
                enmState = ControlState.Pressed
                Me.Invalidate()
            End If
        End Sub

        Protected Overloads Overrides Sub OnMouseMove(ByVal mea As MouseEventArgs)
            MyBase.OnMouseMove(mea)
            If ClientRectangle.Contains(mea.X, mea.Y) Then
                If enmState = ControlState.Hover AndAlso Me.Capture AndAlso Not bCanClick Then
                    bCanClick = True
                    enmState = ControlState.Pressed
                    Me.Invalidate()
                End If
            Else
                If enmState = ControlState.Pressed Then
                    bCanClick = False
                    enmState = ControlState.Hover
                    Me.Invalidate()
                End If
            End If
        End Sub

        Protected Overloads Overrides Sub OnMouseLeave(ByVal ea As EventArgs)
            MyBase.OnMouseLeave(ea)
            enmState = ControlState.Normal
            Me.Invalidate()
        End Sub

        Protected Overloads Overrides Sub OnPaint(ByVal pea As PaintEventArgs)
            Me.OnPaintBackground(pea)
            Select Case enmState
                Case ControlState.Normal
                    If Me.Enabled Then
                        If Me.Focused OrElse Me.IsDefault Then
                            Select Case m_btnShape
                                Case emunType.BtnShape.Rectangle
                                    OnDrawDefault(pea.Graphics)
                                    ' break
                                Case emunType.BtnShape.Ellipse
                                    OnDrawDefaultEllipse(pea.Graphics)
                                    ' break
                            End Select
                        Else
                            Select Case m_btnShape
                                Case emunType.BtnShape.Rectangle
                                    OnDrawNormal(pea.Graphics)
                                    ' break
                                Case emunType.BtnShape.Ellipse
                                    OnDrawNormalEllipse(pea.Graphics)
                                    ' break
                            End Select
                        End If
                    Else
                        OnDrawDisabled(pea.Graphics)
                    End If
                    ' break
                Case ControlState.Hover
                    Select Case m_btnShape
                        Case emunType.BtnShape.Rectangle
                            OnDrawHover(pea.Graphics)
                            ' break
                        Case emunType.BtnShape.Ellipse
                            OnDrawHoverEllipse(pea.Graphics)
                            ' break
                    End Select
                    ' break
                Case ControlState.Pressed
                    Select Case m_btnShape
                        Case emunType.BtnShape.Rectangle
                            OnDrawPressed(pea.Graphics)
                            ' break
                        Case emunType.BtnShape.Ellipse
                            OnDrawPressedEllipse(pea.Graphics)
                            ' break
                    End Select
                    ' break
            End Select
            OnDrawTextAndImage(pea.Graphics)
        End Sub

        Protected Overloads Overrides Sub OnEnabledChanged(ByVal ea As EventArgs)
            MyBase.OnEnabledChanged(ea)
            enmState = ControlState.Normal
            Me.Invalidate()
        End Sub

        Private Sub OnDrawNormal(ByVal g As Graphics)
            DrawNormalButton(g)
        End Sub

        Private Sub OnDrawHoverEllipse(ByVal g As Graphics)
            DrawNormalEllipse(g)
            DrawEllipseHoverBorder(g)
            DrawEllipseBorder(g)
        End Sub

        Private Sub OnDrawHover(ByVal g As Graphics)
            DrawNormalButton(g)
            Dim rcBorder As Rectangle = Me.BorderRectangle
            Dim penTop1 As Pen = New Pen(Color.FromArgb(255, 240, 207))
            Dim penTop2 As Pen = New Pen(Color.FromArgb(253, 216, 137))
            g.DrawLine(penTop1, rcBorder.Left + 2, rcBorder.Top + 1, rcBorder.Right - 2, rcBorder.Top + 1)
            g.DrawLine(penTop2, rcBorder.Left + 1, rcBorder.Top + 2, rcBorder.Right - 1, rcBorder.Top + 2)
            penTop1.Dispose()
            penTop2.Dispose()
            Dim penBottom1 As Pen = New Pen(Color.FromArgb(248, 178, 48))
            Dim penBottom2 As Pen = New Pen(Color.FromArgb(229, 151, 0))
            g.DrawLine(penBottom1, rcBorder.Left + 1, rcBorder.Bottom - 2, rcBorder.Right - 1, rcBorder.Bottom - 2)
            g.DrawLine(penBottom2, rcBorder.Left + 2, rcBorder.Bottom - 1, rcBorder.Right - 2, rcBorder.Bottom - 1)
            penBottom1.Dispose()
            penBottom2.Dispose()
            Dim rcLeft As Rectangle = New Rectangle(rcBorder.Left + 1, rcBorder.Top + 3, 2, rcBorder.Height - 5)
            Dim rcRight As Rectangle = New Rectangle(rcBorder.Right - 2, rcBorder.Top + 3, 2, rcBorder.Height - 5)
            Dim brushSide As LinearGradientBrush = New LinearGradientBrush(rcLeft, Color.FromArgb(254, 221, 149), Color.FromArgb(249, 180, 53), LinearGradientMode.Vertical)
            g.FillRectangle(brushSide, rcLeft)
            g.FillRectangle(brushSide, rcRight)
            brushSide.Dispose()
        End Sub

        Private Sub OnDrawPressedEllipse(ByVal g As Graphics)
            DrawPressedEllipse(g)
            DrawEllipseBorder(g)
        End Sub

        Private Sub DrawPressedEllipse(ByVal g As Graphics)
            Dim rcBorder As Rectangle = Me.BorderRectangle
            Dim rcBackground As Rectangle = New Rectangle(rcBorder.X + 1, rcBorder.Y + 1, rcBorder.Width - 1, rcBorder.Height - 1)
            Dim brushBackground As SolidBrush = New SolidBrush(Color.FromArgb(226, 225, 218))
            g.FillEllipse(brushBackground, rcBackground)
        End Sub

        Private Sub OnDrawPressed(ByVal g As Graphics)
            Dim rcBorder As Rectangle = Me.BorderRectangle
            DrawOuterShadow(g)
            Dim rcBackground As Rectangle = New Rectangle(rcBorder.X + 1, rcBorder.Y + 1, rcBorder.Width - 1, rcBorder.Height - 1)
            Dim brushBackground As SolidBrush = New SolidBrush(Color.FromArgb(226, 225, 218))
            g.FillRectangle(brushBackground, rcBackground)
            brushBackground.Dispose()
            DrawBorder(g)
            Dim penInnerShadowBottomPressed1 As Pen = New Pen(clrInnerShadowBottomPressed1)
            Dim penInnerShadowBottomPressed2 As Pen = New Pen(clrInnerShadowBottomPressed2)
            g.DrawLine(penInnerShadowBottomPressed1, rcBorder.Left + 1, rcBorder.Bottom - 2, rcBorder.Right - 1, rcBorder.Bottom - 2)
            g.DrawLine(penInnerShadowBottomPressed2, rcBorder.Left + 2, rcBorder.Bottom - 1, rcBorder.Right - 2, rcBorder.Bottom - 1)
            penInnerShadowBottomPressed1.Dispose()
            penInnerShadowBottomPressed2.Dispose()
            Dim penInnerShadowTopPressed1 As Pen = New Pen(clrInnerShadowTopPressed1)
            Dim penInnerShadowTopPressed2 As Pen = New Pen(clrInnerShadowTopPressed2)
            g.DrawLine(penInnerShadowTopPressed1, rcBorder.Left + 2, rcBorder.Top + 1, rcBorder.Right - 2, rcBorder.Top + 1)
            g.DrawLine(penInnerShadowTopPressed2, rcBorder.Left + 1, rcBorder.Top + 2, rcBorder.Right - 1, rcBorder.Top + 2)
            penInnerShadowTopPressed1.Dispose()
            penInnerShadowTopPressed2.Dispose()
            Dim penInnerShadowLeftPressed1 As Pen = New Pen(clrInnerShadowLeftPressed1)
            Dim penInnerShadowLeftPressed2 As Pen = New Pen(clrInnerShadowLeftPressed2)
            g.DrawLine(penInnerShadowLeftPressed1, rcBorder.Left + 1, rcBorder.Top + 3, rcBorder.Left + 1, rcBorder.Bottom - 3)
            g.DrawLine(penInnerShadowLeftPressed2, rcBorder.Left + 2, rcBorder.Top + 3, rcBorder.Left + 2, rcBorder.Bottom - 3)
            penInnerShadowLeftPressed1.Dispose()
            penInnerShadowLeftPressed2.Dispose()
        End Sub

        Private Sub OnDrawNormalEllipse(ByVal g As Graphics)
            DrawNormalEllipse(g)
            DrawEllipseBorder(g)
        End Sub

        Private Sub OnDrawDefaultEllipse(ByVal g As Graphics)
            DrawNormalEllipse(g)
            DrawEllipseDefaultBorder(g)
            DrawEllipseBorder(g)
        End Sub

        Private Sub OnDrawDefault(ByVal g As Graphics)
            DrawNormalButton(g)
            Dim rcBorder As Rectangle = Me.BorderRectangle
            Dim penTop1 As Pen = New Pen(Color.FromArgb(206, 231, 255))
            Dim penTop2 As Pen = New Pen(Color.FromArgb(188, 212, 246))
            g.DrawLine(penTop1, rcBorder.Left + 2, rcBorder.Top + 1, rcBorder.Right - 2, rcBorder.Top + 1)
            g.DrawLine(penTop2, rcBorder.Left + 1, rcBorder.Top + 2, rcBorder.Right - 1, rcBorder.Top + 2)
            penTop1.Dispose()
            penTop2.Dispose()
            Dim penBottom1 As Pen = New Pen(Color.FromArgb(137, 173, 228))
            Dim penBottom2 As Pen = New Pen(Color.FromArgb(105, 130, 238))
            g.DrawLine(penBottom1, rcBorder.Left + 1, rcBorder.Bottom - 2, rcBorder.Right - 1, rcBorder.Bottom - 2)
            g.DrawLine(penBottom2, rcBorder.Left + 2, rcBorder.Bottom - 1, rcBorder.Right - 2, rcBorder.Bottom - 1)
            penBottom1.Dispose()
            penBottom2.Dispose()
            Dim rcLeft As Rectangle = New Rectangle(rcBorder.Left + 1, rcBorder.Top + 3, 2, rcBorder.Height - 5)
            Dim rcRight As Rectangle = New Rectangle(rcBorder.Right - 2, rcBorder.Top + 3, 2, rcBorder.Height - 5)
            Dim brushSide As LinearGradientBrush = New LinearGradientBrush(rcLeft, Color.FromArgb(186, 211, 245), Color.FromArgb(137, 173, 228), LinearGradientMode.Vertical)
            g.FillRectangle(brushSide, rcLeft)
            g.FillRectangle(brushSide, rcRight)
            brushSide.Dispose()
        End Sub

        Private Sub OnDrawDisabled(ByVal g As Graphics)
            Dim rcBorder As Rectangle = Me.BorderRectangle
            Dim rcBackground As Rectangle = New Rectangle(rcBorder.X + 1, rcBorder.Y + 1, rcBorder.Width - 1, rcBorder.Height - 1)
            Dim brushBackground As SolidBrush = New SolidBrush(Color.FromArgb(245, 244, 234))
            g.FillRectangle(brushBackground, rcBackground)
            brushBackground.Dispose()
            Dim penBorder As Pen = New Pen(Color.FromArgb(201, 199, 186))
            ControlPaint.DrawRoundedRectangle(g, penBorder, rcBorder, sizeBorderPixelIndent)
            penBorder.Dispose()
        End Sub

        Private Sub OnDrawTextAndImage(ByVal g As Graphics)
            Dim brushText As SolidBrush
            If Enabled Then
                brushText = New SolidBrush(ForeColor)
            Else
                brushText = New SolidBrush(ControlPaint.DisabledForeColor)
            End If
            Dim sf As StringFormat = ControlPaint.GetStringFormat(Me.TextAlign)
            sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show
            If Not (Me.Image Is Nothing) Then
                Dim rc As Rectangle = New Rectangle
                Dim ImagePoint As Point = New Point(6, 4)
                Select Case Me.ImageAlign
                    Case ContentAlignment.MiddleRight
                        rc.Width = Me.ClientRectangle.Width - Me.Image.Width - 8
                        rc.Height = Me.ClientRectangle.Height
                        rc.X = 0
                        rc.Y = 0
                        ImagePoint.X = rc.Width
                        ImagePoint.Y = Me.ClientRectangle.Height / 2 - Image.Height / 2
                        ' break
                    Case ContentAlignment.TopCenter
                        ImagePoint.Y = 2
                        ImagePoint.X = (Me.ClientRectangle.Width - Me.Image.Width) / 2
                        rc.Width = Me.ClientRectangle.Width
                        rc.Height = Me.ClientRectangle.Height - Me.Image.Height - 4
                        rc.X = Me.ClientRectangle.X
                        rc.Y = Me.Image.Height
                        ' break
                    Case ContentAlignment.MiddleCenter
                        ImagePoint.X = (Me.ClientRectangle.Width - Me.Image.Width) / 2
                        ImagePoint.Y = (Me.ClientRectangle.Height - Me.Image.Height) / 2
                        rc.Width = 0
                        rc.Height = 0
                        rc.X = Me.ClientRectangle.Width
                        rc.Y = Me.ClientRectangle.Height
                        ' break
                    Case Else
                        ImagePoint.X = 6
                        ImagePoint.Y = Me.ClientRectangle.Height / 2 - Image.Height / 2
                        rc.Width = Me.ClientRectangle.Width - Me.Image.Width
                        rc.Height = Me.ClientRectangle.Height
                        rc.X = Me.Image.Width
                        rc.Y = 0
                        ' break
                End Select
                ImagePoint.X += locPoint.X
                ImagePoint.Y += locPoint.Y
                If Me.Enabled Then
                    g.DrawImage(Me.Image, ImagePoint)
                Else
                    System.Windows.Forms.ControlPaint.DrawImageDisabled(g, Me.Image, locPoint.X, locPoint.Y, Me.BackColor)
                End If
                If Not (ContentAlignment.MiddleCenter = Me.ImageAlign) Then
                    Dim rs As RectangleF
                    rs.X = rc.X
                    rs.Y = rc.Y
                    rs.Width = rc.Width
                    rs.Height = rc.Height
                    g.DrawString(Me.Text, Me.Font, brushText, rs, sf)
                End If
            Else
                Dim rs As RectangleF
                rs.X = Me.ClientRectangle.X
                rs.Y = Me.ClientRectangle.Y
                rs.Width = Me.ClientRectangle.Width
                rs.Height = Me.ClientRectangle.Height
                g.DrawString(Me.Text, Me.Font, brushText, rs, sf)
            End If
            brushText.Dispose()
            sf.Dispose()
        End Sub

        Private Sub DrawNormalEllipse(ByVal g As Graphics)
            Dim rcBackground As Rectangle = Me.BorderRectangle
            Dim brushBackground As LinearGradientBrush = Nothing
            Select Case m_btnStyle
                Case emunType.XPStyle.Default1
                    brushBackground = New LinearGradientBrush(rcBackground, clrBackground1, clrBackground2, LinearGradientMode.Vertical)
                    ' break
                Case emunType.XPStyle.Blue
                    brushBackground = New LinearGradientBrush(rcBackground, Color.FromArgb(248, 252, 253), Color.FromArgb(172, 171, 201), LinearGradientMode.Vertical)
                    ' break
                Case emunType.XPStyle.OliveGreen
                    brushBackground = New LinearGradientBrush(rcBackground, Color.FromArgb(250, 250, 240), Color.FromArgb(235, 220, 190), LinearGradientMode.Vertical)
                    ' break
                Case emunType.XPStyle.Silver
                    brushBackground = New LinearGradientBrush(rcBackground, Color.FromArgb(253, 253, 253), Color.FromArgb(205, 205, 205), LinearGradientMode.Vertical)
                    ' break
            End Select
            Dim relativeIntensities() As Single = {0, 0.008, 1}
            Dim relativePositions() As Single = {0, 0.22, 1}
            Dim blend As Blend = New Blend
            blend.Factors = relativeIntensities
            blend.Positions = relativePositions
            brushBackground.Blend = blend
            g.FillEllipse(brushBackground, rcBackground)
        End Sub

        Private Sub DrawNormalButton(ByVal g As Graphics)
            Dim rcBorder As Rectangle = Me.BorderRectangle
            DrawOuterShadow(g)
            Dim rcBackground As Rectangle = New Rectangle(rcBorder.X + 1, rcBorder.Y + 1, rcBorder.Width - 1, rcBorder.Height - 1)
            Dim brushBackground As LinearGradientBrush = Nothing
            Select Case m_btnStyle
                Case emunType.XPStyle.Default1
                    brushBackground = New LinearGradientBrush(rcBackground, clrBackground1, clrBackground2, LinearGradientMode.Vertical)
                    ' break
                Case emunType.XPStyle.Blue
                    brushBackground = New LinearGradientBrush(rcBackground, Color.FromArgb(248, 252, 253), Color.FromArgb(172, 171, 201), LinearGradientMode.Vertical)
                    ' break
                Case emunType.XPStyle.OliveGreen
                    brushBackground = New LinearGradientBrush(rcBackground, Color.FromArgb(250, 250, 240), Color.FromArgb(235, 220, 190), LinearGradientMode.Vertical)
                    ' break
                Case emunType.XPStyle.Silver
                    brushBackground = New LinearGradientBrush(rcBackground, Color.FromArgb(253, 253, 253), Color.FromArgb(205, 205, 205), LinearGradientMode.Vertical)
                    ' break
            End Select
            Dim relativeIntensities() As Single = {0, 0.08, 1}
            Dim relativePositions() As Single = {0, 0.32, 1}
            Dim blend As Blend = New Blend
            blend.Factors = relativeIntensities
            blend.Positions = relativePositions
            brushBackground.Blend = blend
            g.FillRectangle(brushBackground, rcBackground)
            brushBackground.Dispose()
            DrawBorder(g)
            If emunType.XPStyle.Default1 = m_btnStyle Then
                Dim penInnerShadowBottom1 As Pen = New Pen(clrInnerShadowBottom1)
                Dim penInnerShadowBottom2 As Pen = New Pen(clrInnerShadowBottom2)
                Dim penInnerShadowBottom3 As Pen = New Pen(clrInnerShadowBottom3)
                g.DrawLine(penInnerShadowBottom1, rcBorder.Left + 1, rcBorder.Bottom - 3, rcBorder.Right - 1, rcBorder.Bottom - 3)
                g.DrawLine(penInnerShadowBottom2, rcBorder.Left + 1, rcBorder.Bottom - 2, rcBorder.Right - 1, rcBorder.Bottom - 2)
                g.DrawLine(penInnerShadowBottom3, rcBorder.Left + 2, rcBorder.Bottom - 1, rcBorder.Right - 2, rcBorder.Bottom - 1)
                penInnerShadowBottom1.Dispose()
                penInnerShadowBottom2.Dispose()
                penInnerShadowBottom3.Dispose()
                Dim ptInnerShadowRight1a As Point = New Point(rcBorder.Right - 2, rcBorder.Top + 1)
                Dim ptInnerShadowRight1b As Point = New Point(rcBorder.Right - 2, rcBorder.Bottom - 1)
                Dim ptInnerShadowRight2a As Point = New Point(rcBorder.Right - 1, rcBorder.Top + 2)
                Dim ptInnerShadowRight2b As Point = New Point(rcBorder.Right - 1, rcBorder.Bottom - 2)
                Dim brushInnerShadowRight1 As LinearGradientBrush = New LinearGradientBrush(ptInnerShadowRight1a, ptInnerShadowRight1b, clrInnerShadowRight1a, clrInnerShadowRight1b)
                Dim penInnerShadowRight1 As Pen = New Pen(brushInnerShadowRight1)
                Dim brushInnerShadowRight2 As LinearGradientBrush = New LinearGradientBrush(ptInnerShadowRight2a, ptInnerShadowRight2b, clrInnerShadowRight2a, clrInnerShadowRight2b)
                Dim penInnerShadowRight2 As Pen = New Pen(brushInnerShadowRight2)
                g.DrawLine(penInnerShadowRight1, ptInnerShadowRight1a, ptInnerShadowRight1b)
                g.DrawLine(penInnerShadowRight2, ptInnerShadowRight2a, ptInnerShadowRight2b)
                penInnerShadowRight1.Dispose()
                penInnerShadowRight2.Dispose()
                brushInnerShadowRight1.Dispose()
                brushInnerShadowRight2.Dispose()
                Dim penTop As Pen = New Pen(Color.White)
                g.DrawLine(penTop, rcBorder.Left + 2, rcBorder.Top + 1, rcBorder.Right - 2, rcBorder.Top + 1)
                g.DrawLine(penTop, rcBorder.Left + 1, rcBorder.Top + 2, rcBorder.Right - 1, rcBorder.Top + 2)
                g.DrawLine(penTop, rcBorder.Left + 1, rcBorder.Top + 3, rcBorder.Right - 1, rcBorder.Top + 3)
                penTop.Dispose()
            End If
        End Sub

        Private Sub DrawOuterShadow(ByVal g As Graphics)
            Dim brushOuterShadow As LinearGradientBrush = New LinearGradientBrush(ClientRectangle, clrOuterShadow1, clrOuterShadow2, LinearGradientMode.Vertical)
            g.FillRectangle(brushOuterShadow, ClientRectangle)
            brushOuterShadow.Dispose()
        End Sub

        Private Sub DrawEllipseOuterShadow(ByVal g As Graphics)
            Dim brushOuterShadow As LinearGradientBrush = New LinearGradientBrush(ClientRectangle, clrOuterShadow1, clrOuterShadow2, LinearGradientMode.Vertical)
            g.FillRectangle(brushOuterShadow, ClientRectangle)
            brushOuterShadow.Dispose()
        End Sub

        Private Sub DrawBorder(ByVal g As Graphics)
            Dim penBorder As Pen = New Pen(clrBorder)
            ControlPaint.DrawRoundedRectangle(g, penBorder, Me.BorderRectangle, sizeBorderPixelIndent)
            penBorder.Dispose()
        End Sub

        Private Sub DrawEllipseBorder(ByVal g As Graphics)
            Dim penBorder As Pen = New Pen(Color.FromArgb(0, 0, 0))
            Dim oldSmoothingMode As SmoothingMode = g.SmoothingMode
            g.SmoothingMode = SmoothingMode.AntiAlias
            g.DrawEllipse(penBorder, Me.BorderRectangle)
            g.SmoothingMode = oldSmoothingMode
            penBorder.Dispose()
        End Sub

        Private Sub DrawEllipseDefaultBorder(ByVal g As Graphics)
            Dim penTop2 As Pen = New Pen(Color.FromArgb(137, 173, 228), 2)
            Dim rcInFrame As Rectangle = New Rectangle(Me.BorderRectangle.X + 2, Me.BorderRectangle.Y + 1, Me.BorderRectangle.Width - 4, Me.BorderRectangle.Height - 2)
            Dim oldSmoothingMode As SmoothingMode = g.SmoothingMode
            g.SmoothingMode = SmoothingMode.AntiAlias
            g.DrawEllipse(penTop2, rcInFrame)
            g.SmoothingMode = oldSmoothingMode
            penTop2.Dispose()
        End Sub

        Private Sub DrawEllipseHoverBorder(ByVal g As Graphics)
            Dim penTop2 As Pen = New Pen(Color.FromArgb(248, 178, 48), 2)
            Dim rcInFrame As Rectangle = New Rectangle(Me.BorderRectangle.X + 2, Me.BorderRectangle.Y + 1, Me.BorderRectangle.Width - 4, Me.BorderRectangle.Height - 2)
            Dim oldSmoothingMode As SmoothingMode = g.SmoothingMode
            g.SmoothingMode = SmoothingMode.AntiAlias
            g.DrawEllipse(penTop2, rcInFrame)
            g.SmoothingMode = oldSmoothingMode
            penTop2.Dispose()
        End Sub

#End Region


    End Class

End Namespace

本文地址:http://com.8s8s.com/it/it41639.htm