通过在一次滚动移动中更改超过 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 文件导入项目并像使用任何其他元素一样使用它们。