Как реализовать необычную полосу прокрутки для многострочного текстового поля? - PullRequest
9 голосов
/ 28 мая 2011

Я хочу реализовать необычную полосу прокрутки для многострочного текстового поля, как показано на рисунке ниже:

Standard scroll bar and fancy scroll bar

Есть идеи для этой необычной полосы прокрутки?

P / S: Я хочу решение vb.net.

Ответы [ 2 ]

5 голосов
/ 02 июня 2011

Этот код очень громоздкий и неприятный для работы, но он работает

Это полностью нарисованный класс управления GDI + пользовательская полоса прокрутки.Все его методы рисования могут быть переопределены, что позволяет разработчикам рисовать его по своему усмотрению.

http://www.codeproject.com/KB/miscctrl/corescrollbar.aspx

4 голосов
/ 05 июня 2011

Если причудливая полоса прокрутки может быть реализована в качестве другого элемента управления (ваше изображение действительно выглядит так), вот код ListBox, который поддерживает пользовательскую прокрутку:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...