Получить вертикальную полосу прокрутки как целое число в vb.net - PullRequest
2 голосов
/ 25 октября 2009

У меня есть RichTextBox, и мне нужно найти положение вертикальной полосы прокрутки.

Есть ли способ сделать это без Pinvoke? Если нет, то как это сделать с помощью Pinvoke?

Мне нужно вернуть целочисленное значение.

Спасибо за помощь!

1 Ответ

2 голосов
/ 25 октября 2009

Я не знаю, как это сделать без PInvoke. Вы можете использовать PInvoke для вызова GetScrollPos .

Вот как вы можете это попробовать.

Шаг 1: Создание пользовательского элемента управления RichTextBox путем расширения стандартного RichTextBox.

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Windows.Forms

Namespace WindowsFormsApplication1

    Public Class MyRichTextBox
        Inherits RichTextBox
        <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
        Public Shared Function GetScrollPos(ByVal hWnd As IntPtr, ByVal nBar As Integer) As Integer
        End Function

        <DllImport("user32.dll")> _
        Private Shared Function SetScrollPos(ByVal hWnd As IntPtr, ByVal nBar As Integer, ByVal nPos As Integer, ByVal bRedraw As Boolean) As Integer
        End Function

        Private Const SB_HORZ As Integer = &H0
        Private Const SB_VERT As Integer = &H1

        ''' <summary>
        ''' Gets and Sets the Horizontal Scroll position of the control.
        ''' </summary>
        Public Property HScrollPos() As Integer
            Get
                Return GetScrollPos(DirectCast(Me.Handle, IntPtr), SB_HORZ)
            End Get
            Set(ByVal value As Integer)
                SetScrollPos(DirectCast(Me.Handle, IntPtr), SB_HORZ, value, True)
            End Set
        End Property

        ''' <summary>
        ''' Gets and Sets the Vertical Scroll position of the control.
        ''' </summary>
        Public Property VScrollPos() As Integer
            Get
                Return GetScrollPos(DirectCast(Me.Handle, IntPtr), SB_VERT)
            End Get
            Set(ByVal value As Integer)
                SetScrollPos(DirectCast(Me.Handle, IntPtr), SB_VERT, value, True)
            End Set
        End Property
    End Class
End Namespace

Это добавит два свойства к стандартному RichTextBox: HScrollPos и ​​VScrollPos. Эти свойства позволят вам получить и установить горизонтальную и вертикальную позицию полосы прокрутки в вашем элементе управления.

Шаг 2: Создайте тестовую форму и опробуйте свой элемент управления.

Создайте Winform в том же проекте, что и пользовательский элемент управления. Удалите пользовательский элемент управления в тестовой форме и добавьте кнопку в форму. В событии Click формы добавьте следующий код для просмотра вертикальной позиции прокрутки пользовательского элемента управления.

Console.WriteLine(myRichTextBox1.VScrollPos)

Несколько вещей, за которыми нужно следить:

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

  2. В зависимости от способа управления (и возможно форма) размером (не для упомянуть изменения в содержании текста управления), настройка VScrollPos может привести к сбою вашей программы или не восстановить его в положение, это был, когда значение VScrollPos было сохранены.

  3. Я никогда не использовал этот код. я думал, что ваш вопрос интересно и сделал немного исследование, чтобы придумать мой ответ.

...