Pregunta

Tengo un RichTextBox y necesito encontrar la posición de la barra de desplazamiento vertical.

¿Hay alguna manera de hacer esto sin Pinvoke? Si no es así, ¿de qué manera se puede hacer esto CON Pinvoke?

Necesito devolver un valor entero.

¡Gracias por la ayuda!

¿Fue útil?

Solución

No conozco ninguna forma de hacer esto sin PInvoke. Puede usar PInvoke para llamar a GetScrollPos .

Así es como puedes intentarlo.

Paso 1: crea un control RichTextBox personalizado extendiendo una RichTextBox estándar.

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

Esto agregará dos propiedades a un RichTextBox estándar: HScrollPos y VScrollPos. Estas propiedades le permitirán obtener y establecer la posición de la barra de desplazamiento horizontal y vertical en su control.

Paso 2: crea un formulario de prueba y prueba tu control.

Crea un Winform en el mismo proyecto que tu control personalizado. Suelte el control personalizado en el formulario de prueba y agregue un botón en el formulario. En el evento Click del formulario, agregue el siguiente código para ver la posición de desplazamiento vertical de su control personalizado.

Console.WriteLine(myRichTextBox1.VScrollPos)

Algunas cosas a tener en cuenta:

  1. Si su control no está actualmente mostrando una barra de desplazamiento vertical, la llamar a HScrollPos bloqueará su programa. Hay unos pocos obviamente maneras de evitar esto (compruebe que el la barra de desplazamiento se muestra antes revisar la propiedad, o hacer la barra de desplazamiento vertical siempre visible, etc.).

  2. Dependiendo de cómo el control (y     posiblemente forma) es de tamaño (no para     Mencionar cambios en el contenido del texto.     del control), configurando el     VScrollPos puede bloquear su programa o     No lo devuelves a la posición que     estaba en cuando el valor VScrollPos era     guardado.

  3. Nunca he usado este código. yo     pensé que tu pregunta era     interesante e hizo un poco de     investigación para llegar a mi respuesta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top