Как реализовать fancy scroll bar для многострочного текстового поля?
Я хочу реализовать причудливую полосу прокрутки для многострочного текстового поля, как показано ниже:
есть идеи для этой причудливой полосы прокрутки?
P/ S: Я хочу vb.net решение.
2 ответов
Если панель прокрутки fancy может быть реализована как другой элемент управления (ваше изображение действительно выглядит так), вот код списка, который поддерживает пользовательскую прокрутку:
Imports System.Runtime.InteropServices
Public Class CustomScrollListBox
Inherits ListBox
Public Sub Scroll(ByVal percentage As Single)
If (percentage < 0.0!) Then
Throw New ArgumentException(Nothing, "percentage")
End If
' Sends the scroll / set position Windows message
Const WM_VSCROLL As Integer = &H115
Const SB_THUMBPOSITION As Integer = 4
Dim wp As Integer = CInt(((percentage * MyBase.Items.Count) * 65536.0!)) + SB_THUMBPOSITION
CustomScrollListBox.SendMessage(MyBase.Handle, WM_VSCROLL, New IntPtr(wp), IntPtr.Zero)
End Sub
<DllImport("user32.dll")> _
Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
End Function
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
' Removes the vertical scroll window style
Dim p As CreateParams = MyBase.CreateParams
Const WS_VSCROLL As Integer = &H200000
p.Style = (p.Style And -WS_VSCROLL)
Return p
End Get
End Property
End Class
и вот пример формы, которая использует его. Я реализовал пользовательский скроллер в качестве стандартной Трекбара (trackBar1) для примера:
Public Class Form1
Private trackBar As TrackBar
Private listBox As CustomScrollListBox
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
' initialize some listbox props
listBox = New CustomScrollListBox
listBox.Location = New Point(&H19, 210)
listBox.Name = "listBox2"
listBox.Size = New Size((&H17D - Me.TrackBar1.Width), &HAD)
listBox.TabIndex = 1
MyBase.Controls.Add(listBox)
' add some items
Dim i As Integer
For i = 0 To 100 - 1
listBox.Items.Add(("item" & i))
Next i
End Sub
Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
' compute trackbar's position as a percentage
listBox.Scroll(CSng(TrackBar1.Maximum - TrackBar1.Value) / TrackBar1.Maximum - TrackBar1.Minimum)
End Sub
End Class
этот код очень коренастый и неприятный для работы, но он работает
Это полностью нарисованный GDI + custom класс управления полосой прокрутки. Все его методы рисования переопределяемый, позволяя разработчикам рисовать его однако они выбирают.