通过在一次滚动移动中更改超过 1 个值来缩小自定义轨迹栏
To make the custom trackbar smaller by changing more than 1 value in one scroll move
我创建了一个自定义轨迹栏,它给出的值介于 100-1600 之间。问题是我无法减小轨迹栏的大小。 trackbar 的宽度必须为 1600,用户才能访问所有值并同时将拇指保持在 trackbar 中。这是我的代码:
Public Class myTrackBar
Inherits Control
'Public Value As Integer
Private Pointer As New Bitmap(25, 30)
Private Rect As New Rectangle(100, 0, 20, 30)
Public Event Scroll(ByVal Sender As Object, ByVal e As ValueChangedEventArgs)
Private Moving As Boolean
Private Offset As Integer
Public Sub New()
'Size = New Size(210, 50)
DoubleBuffered = True
Using g As Graphics = Graphics.FromImage(Pointer)
g.Clear(Color.White)
g.FillRectangle(Brushes.DarkBlue, New Rectangle(0, 0, 50, 50))
'g.FillPolygon(Brushes.Blue, New Point() {New Point(0, 15), New Point(5, 20), New Point(10, 15)})
'g.FillEllipse(Brushes.DarkBlue, 0, 0, 19, 19)
End Using
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
e.Graphics.FillRectangle(Brushes.White, New Rectangle(0, 0, Width - 100, Height))
Dim X As Integer = 15
' For count As Integer = 1 To 10
e.Graphics.DrawLine(New Pen(Brushes.Green, 16), New Point(0, 15), New Point(Width - 100, 15))
' X += 20
'Next
' Using P As New Pen(Brushes.Black, 1)
'P.DashStyle = Drawing2D.DashStyle.Dot
'e.Graphics.DrawRectangle(P, New Rectangle(100, 1, Width - 5, Height - 5))
'End Using
e.Graphics.DrawImage(Pointer, Rect)
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
End Sub
Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
If Rect.Contains(e.Location) Then
Moving = True
Offset = (e.Location.X - Rect.X)
End If
End Sub
Protected Overrides Sub OnMouseup(ByVal e As System.Windows.Forms.MouseEventArgs)
Moving = False
End Sub
Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
If Moving Then
Rect.X = Math.Min(Math.Max(e.Location.X - Offset, 0), 1500)
Invalidate()
RaiseEvent Scroll(Me, New ValueChangedEventArgs(Rect.X))
End If
End Sub
Public Property Value As Integer
Get
Return CInt((Rect.X + 100))
End Get
Set(ByVal value As Integer)
Rect.X = CInt(value)
End Set
End Property
End Class
网上有各种可用于轨迹栏的 dll。如果您只想在项目中使用它,您只需将 dll 文件导入项目并像使用任何其他元素一样使用它们。
我创建了一个自定义轨迹栏,它给出的值介于 100-1600 之间。问题是我无法减小轨迹栏的大小。 trackbar 的宽度必须为 1600,用户才能访问所有值并同时将拇指保持在 trackbar 中。这是我的代码:
Public Class myTrackBar
Inherits Control
'Public Value As Integer
Private Pointer As New Bitmap(25, 30)
Private Rect As New Rectangle(100, 0, 20, 30)
Public Event Scroll(ByVal Sender As Object, ByVal e As ValueChangedEventArgs)
Private Moving As Boolean
Private Offset As Integer
Public Sub New()
'Size = New Size(210, 50)
DoubleBuffered = True
Using g As Graphics = Graphics.FromImage(Pointer)
g.Clear(Color.White)
g.FillRectangle(Brushes.DarkBlue, New Rectangle(0, 0, 50, 50))
'g.FillPolygon(Brushes.Blue, New Point() {New Point(0, 15), New Point(5, 20), New Point(10, 15)})
'g.FillEllipse(Brushes.DarkBlue, 0, 0, 19, 19)
End Using
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
e.Graphics.FillRectangle(Brushes.White, New Rectangle(0, 0, Width - 100, Height))
Dim X As Integer = 15
' For count As Integer = 1 To 10
e.Graphics.DrawLine(New Pen(Brushes.Green, 16), New Point(0, 15), New Point(Width - 100, 15))
' X += 20
'Next
' Using P As New Pen(Brushes.Black, 1)
'P.DashStyle = Drawing2D.DashStyle.Dot
'e.Graphics.DrawRectangle(P, New Rectangle(100, 1, Width - 5, Height - 5))
'End Using
e.Graphics.DrawImage(Pointer, Rect)
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
End Sub
Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
If Rect.Contains(e.Location) Then
Moving = True
Offset = (e.Location.X - Rect.X)
End If
End Sub
Protected Overrides Sub OnMouseup(ByVal e As System.Windows.Forms.MouseEventArgs)
Moving = False
End Sub
Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
If Moving Then
Rect.X = Math.Min(Math.Max(e.Location.X - Offset, 0), 1500)
Invalidate()
RaiseEvent Scroll(Me, New ValueChangedEventArgs(Rect.X))
End If
End Sub
Public Property Value As Integer
Get
Return CInt((Rect.X + 100))
End Get
Set(ByVal value As Integer)
Rect.X = CInt(value)
End Set
End Property
End Class
网上有各种可用于轨迹栏的 dll。如果您只想在项目中使用它,您只需将 dll 文件导入项目并像使用任何其他元素一样使用它们。