ScrollBarRenderer Class
Provides methods used to render a scroll bar control with visual styles. This class cannot be inherited.
Assembly: System.Windows.Forms (in System.Windows.Forms.dll)
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
Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98
The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.