Export (0) Print
Expand All

ScrollBarRenderer Class

Provides methods used to render a scroll bar control with visual styles. This class cannot be inherited.

System.Object
  System.Windows.Forms.ScrollBarRenderer

Namespace:  System.Windows.Forms
Assembly:  System.Windows.Forms (in System.Windows.Forms.dll)

'Declaration
Public NotInheritable Class ScrollBarRenderer

The ScrollBarRenderer type exposes the following members.

  NameDescription
Public propertyStatic memberIsSupportedGets a value indicating whether the ScrollBarRenderer class can be used to draw a scroll bar with visual styles.
Top

  NameDescription
Public methodStatic memberDrawArrowButtonDraws a scroll arrow with visual styles.
Public methodStatic memberDrawHorizontalThumbDraws a horizontal scroll box (also known as the thumb) with visual styles.
Public methodStatic memberDrawHorizontalThumbGripDraws a grip on a horizontal scroll box (also known as the thumb) with visual styles.
Public methodStatic memberDrawLeftHorizontalTrackDraws a horizontal scroll bar track with visual styles.
Public methodStatic memberDrawLowerVerticalTrackDraws a vertical scroll bar track with visual styles.
Public methodStatic memberDrawRightHorizontalTrackDraws a horizontal scroll bar track with visual styles.
Public methodStatic memberDrawSizeBoxDraws a scroll bar sizing handle with visual styles.
Public methodStatic memberDrawUpperVerticalTrackDraws a vertical scroll bar track with visual styles.
Public methodStatic memberDrawVerticalThumbDraws a vertical scroll box (also known as the thumb) with visual styles.
Public methodStatic memberDrawVerticalThumbGripDraws a grip on a vertical scroll box (also known as the thumb) with visual styles.
Public methodEquals(Object)Determines whether the specified object is equal to the current object. (Inherited from Object.)
Public methodGetHashCodeServes as the default hash function. (Inherited from Object.)
Public methodStatic memberGetSizeBoxSizeReturns the size of the sizing handle.
Public methodStatic memberGetThumbGripSizeReturns the size of the scroll box grip.
Public methodGetTypeGets the Type of the current instance. (Inherited from Object.)
Public methodToStringReturns a string that represents the current object. (Inherited from Object.)
Top

The ScrollBarRenderer class provides a set of static methods that can be used to render a scroll bar control with the current visual style of the operating system. Rendering a control refers to drawing the user interface of a control. This is useful if you are drawing a custom control that should have the appearance of the current visual style. To draw a scroll bar, use a combination of the methods in this class to render each part of the scroll bar.

If visual styles are enabled in the operating system and visual styles are applied to the client area of application windows, the methods of this class will draw the scroll bar with the current visual style. Otherwise, the methods of this class will throw an InvalidOperationException. To determine whether the members of this class can be used, you can check the value of the IsSupported property.

This class wraps the functionality of a System.Windows.Forms.VisualStyles.VisualStyleRenderer that is set to one of the elements exposed by the System.Windows.Forms.VisualStyles.VisualStyleElement.ScrollBar class. For more information, see Rendering Controls with Visual Styles.

Windows XP Home Edition, Windows XP Professional x64 Edition, Windows Server 2003 Platform Note: Visual styles are supported only on these platforms.

The following code example demonstrates how to create a custom control that uses the ScrollBarRenderer methods to draw a scroll bar that responds to mouse clicks.

Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.VisualStyles

Namespace ScrollBarRendererSample

    Class Form1
        Inherits Form

        Public Sub New()
            Me.Size = New Size(500, 500)

            Dim Bar1 As New CustomScrollBar()
            Bar1.Location = New Point(50, 100)
            Bar1.Size = New Size(200, 20)

            Controls.Add(Bar1)
        End Sub

        <STAThread()> _
        Shared Sub Main()
            ' The call to EnableVisualStyles below does not affect whether  
            ' ScrollBarRenderer.IsSupported is true; as long as visual styles  
            ' are enabled by the operating system, IsSupported is true.
            Application.EnableVisualStyles()
            Application.Run(New Form1())
        End Sub 
    End Class 

    Public Class CustomScrollBar
        Inherits Control

        Private clickedBarRectangle As Rectangle
        Private thumbRectangle As Rectangle
        Private leftArrowRectangle As Rectangle
        Private rightArrowRectangle As Rectangle
        Private leftArrowClicked As Boolean = False 
        Private rightArrowClicked As Boolean = False 
        Private leftBarClicked As Boolean = False 
        Private rightBarClicked As Boolean = False 
        Private thumbClicked As Boolean = False 
        Private thumbState As ScrollBarState = ScrollBarState.Normal
        Private leftButtonState As ScrollBarArrowButtonState = _
            ScrollBarArrowButtonState.LeftNormal
        Private rightButtonState As ScrollBarArrowButtonState = _
            ScrollBarArrowButtonState.RightNormal

        ' This control does not allow these widths to be altered. 
        Private thumbWidth As Integer = 15
        Private arrowWidth As Integer = 17

        ' Set the right limit of the thumb's right border. 
        Private thumbRightLimitRight As Integer = 0

        ' Set the right limit of the thumb's left border. 
        Private thumbRightLimitLeft As Integer = 0

        ' Set the left limit of thumb's left border. 
        Private thumbLeftLimit As Integer = 0

        ' Set the distance from the left edge of the thumb to the  
        ' cursor tip. 
        Private thumbPosition As Integer = 0

        ' Set the distance from the left edge of the scroll bar track to  
        ' the cursor tip. 
        Private trackPosition As Integer = 0

        ' This timer draws the moving thumb while the scroll arrows or  
        ' track are pressed. 
        Private WithEvents progressTimer As New Timer()

        Public Sub New()
            With Me
                .Location = New Point(10, 10)
                .Width = 200
                .Height = 20
                .DoubleBuffered = True 
            End With
            SetUpScrollBar()
            progressTimer.Interval = 20
        End Sub 

        ' Calculate the sizes of the scroll bar elements. 
        Private Sub SetUpScrollBar()

            clickedBarRectangle = Me.ClientRectangle
            thumbRectangle = New Rectangle(ClientRectangle.X + _
                Me.ClientRectangle.Width / 2, Me.ClientRectangle.Y, _
                thumbWidth, Me.ClientRectangle.Height)
            leftArrowRectangle = New Rectangle(Me.ClientRectangle.X, _
                Me.ClientRectangle.Y, arrowWidth, Me.ClientRectangle.Height)
            rightArrowRectangle = New Rectangle(Me.ClientRectangle.Right - _
                arrowWidth, Me.ClientRectangle.Y, arrowWidth, _
                Me.ClientRectangle.Height)

            ' Set the default starting thumb position.
            thumbPosition = thumbWidth / 2

            ' Set the right limit of the thumb's right border.
            thumbRightLimitRight = Me.ClientRectangle.Right - arrowWidth

            ' Set the right limit of the thumb's left border.
            thumbRightLimitLeft = thumbRightLimitRight - thumbWidth

            ' Set the left limit of the thumb's left border.
            thumbLeftLimit = Me.ClientRectangle.X + arrowWidth
        End Sub 

        ' Draw the scroll bar in its normal state. 
        Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
            MyBase.OnPaint(e)

            ' Visual styles are not enabled. 
            If Not ScrollBarRenderer.IsSupported Then 
                Me.Parent.Text = "CustomScrollBar Disabled" 
                Return 
            End If 

            Me.Parent.Text = "CustomScrollBar Enabled" 

            ' Draw the scroll bar track.
            ScrollBarRenderer.DrawRightHorizontalTrack(e.Graphics, _
                Me.ClientRectangle, ScrollBarState.Normal)

            ' Draw the thumb and thumb grip in the current state.
            ScrollBarRenderer.DrawHorizontalThumb(e.Graphics, _
                thumbRectangle, thumbState)
            ScrollBarRenderer.DrawHorizontalThumbGrip(e.Graphics, _
                thumbRectangle, thumbState)

            ' Draw the scroll arrows in the current state.
            ScrollBarRenderer.DrawArrowButton(e.Graphics, _
                leftArrowRectangle, leftButtonState)
            ScrollBarRenderer.DrawArrowButton(e.Graphics, _
                rightArrowRectangle, rightButtonState)

            ' Draw a highlighted rectangle in the left side of the scroll  
            ' bar track if the user has clicked between the left arrow  
            ' and thumb. 
            If leftBarClicked Then
                clickedBarRectangle.X = thumbLeftLimit
                clickedBarRectangle.Width = thumbRectangle.X - thumbLeftLimit
                ScrollBarRenderer.DrawLeftHorizontalTrack(e.Graphics, _
                    clickedBarRectangle, ScrollBarState.Pressed)

            ' Draw a highlighted rectangle in the right side of the scroll  
            ' bar track if the user has clicked between the right arrow  
            ' and thumb. 
            ElseIf rightBarClicked Then
                clickedBarRectangle.X = thumbRectangle.X + _
                    thumbRectangle.Width
                clickedBarRectangle.Width = thumbRightLimitRight - _
                    clickedBarRectangle.X
                ScrollBarRenderer.DrawRightHorizontalTrack(e.Graphics, _
                    clickedBarRectangle, ScrollBarState.Pressed)
            End If 
        End Sub 

        ' Handle a mouse click in the scroll bar. 
        Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
            MyBase.OnMouseDown(e)

            If Not ScrollBarRenderer.IsSupported Then 
                Return 
            End If 

            ' When the thumb is clicked, update the distance from the left 
            ' edge of the thumb to the cursor tip. 
            If thumbRectangle.Contains(e.Location) Then
                thumbClicked = True
                thumbPosition = e.Location.X - thumbRectangle.X
                thumbState = ScrollBarState.Pressed

            ' When the left arrow is clicked, start the timer to scroll  
            ' while the arrow is held down. 
            ElseIf leftArrowRectangle.Contains(e.Location) Then
                leftArrowClicked = True
                leftButtonState = ScrollBarArrowButtonState.LeftPressed
                progressTimer.Start()

            ' When the right arrow is clicked, start the timer to scroll  
            ' while arrow is held down. 
            ElseIf rightArrowRectangle.Contains(e.Location) Then
                rightArrowClicked = True
                rightButtonState = ScrollBarArrowButtonState.RightPressed
                progressTimer.Start()

            ' When the scroll bar is clicked, start the timer to move the 
            ' thumb while the mouse is held down. 
            Else
                trackPosition = e.Location.X
                If e.Location.X < Me.thumbRectangle.X Then
                    leftBarClicked = True 
                Else
                    rightBarClicked = True 
                End If
                progressTimer.Start()
            End If

            Invalidate()
        End Sub 

        ' Draw the track. 
        Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
            MyBase.OnMouseUp(e)

            If Not ScrollBarRenderer.IsSupported Then 
                Return 
            End If 

            ' Update the thumb position, if the new location is within  
            ' the bounds. 
            If thumbClicked Then
                thumbClicked = False
                thumbState = ScrollBarState.Normal
                If e.Location.X > thumbLeftLimit + thumbPosition And _
                    e.Location.X < thumbRightLimitLeft + thumbPosition Then
                    thumbRectangle.X = e.Location.X - thumbPosition
                    thumbClicked = False 
                End If 

            ' If one of the four thumb movement areas was clicked,  
            ' stop the timer. 
            ElseIf leftArrowClicked Then
                leftArrowClicked = False
                leftButtonState = ScrollBarArrowButtonState.LeftNormal
                progressTimer.Stop()

            ElseIf rightArrowClicked Then
                rightArrowClicked = False
                rightButtonState = ScrollBarArrowButtonState.RightNormal
                progressTimer.Stop()

            ElseIf leftBarClicked Then
                leftBarClicked = False
                progressTimer.Stop()

            ElseIf rightBarClicked Then
                rightBarClicked = False
                progressTimer.Stop()
            End If

            Invalidate()
        End Sub 

        ' Track mouse movements if the user clicks on the scroll bar thumb. 
        Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
            MyBase.OnMouseMove(e)

            If Not ScrollBarRenderer.IsSupported Then 
                Return 
            End If 

            ' Update the thumb position, if the new location is  
            ' within the bounds. 
            If thumbClicked Then 

                ' The thumb is all the way to the left. 
                If e.Location.X <= thumbLeftLimit + thumbPosition Then
                    thumbRectangle.X = thumbLeftLimit

                ' The thumb is all the way to the right. 
                ElseIf e.Location.X >= thumbRightLimitLeft + thumbPosition Then
                    thumbRectangle.X = thumbRightLimitLeft

                ' The thumb is between the ends of the track. 
                Else
                    thumbRectangle.X = e.Location.X - thumbPosition
                End If

                Invalidate()

            End If 
        End Sub 

        ' Recalculate the sizes of the scroll bar elements. 
        Protected Overrides Sub OnSizeChanged(ByVal e As EventArgs)
            MyBase.OnSizeChanged(e)
            SetUpScrollBar()
        End Sub 

        ' Handle the timer tick by updating the thumb position. 
        Private Sub progressTimer_Tick(ByVal sender As Object, _
            ByVal myEventArgs As EventArgs) Handles progressTimer.Tick

            If Not ScrollBarRenderer.IsSupported Then 
                Return 
            End If 

            ' If an arrow is clicked, move the thumb in small increments. 
            If rightArrowClicked And thumbRectangle.X < thumbRightLimitLeft Then
                thumbRectangle.X += 1

            ElseIf leftArrowClicked And thumbRectangle.X > thumbLeftLimit Then
                    thumbRectangle.X -= 1

            ' If the track bar to right of the thumb is clicked, move the  
            ' thumb to the right in larger increments until the right edge  
            ' of the thumb hits the cursor. 
            ElseIf rightBarClicked And thumbRectangle.X < thumbRightLimitLeft _
                And thumbRectangle.X + thumbRectangle.Width < trackPosition Then
                thumbRectangle.X += 3

            ' If the track bar to left of the thumb is clicked, move the  
            ' thumb to the left in larger increments until the left edge  
            ' of the thumb hits the cursor. 
            ElseIf leftBarClicked And thumbRectangle.X > thumbLeftLimit And _
                thumbRectangle.X > trackPosition Then
                thumbRectangle.X -= 3
            End If

            Invalidate()
        End Sub 

    End Class 
End Namespace

.NET Framework

Supported in: 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
Show:
© 2014 Microsoft