Pergunta

Eu tenho um RichTextBox e eu preciso encontrar a posição da barra de rolagem vertical.

Existe alguma maneira de fazer isso sem Pinvoke? Se não, o que é uma maneira de fazer isso com Pinvoke?

Eu preciso retornar um valor inteiro.

Obrigado pela ajuda!

Foi útil?

Solução

Eu não conheço nenhuma maneira de fazer isso sem PInvoke. Você pode usar PInvoke para chamar GetScrollPos .

Veja como você pode experimentá-lo.

Passo 1:. Criar um controle RichTextBox costume, estendendo um RichTextBox padrão

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

Isto irá adicionar duas propriedades a um RichTextBox padrão: HScrollPos e VScrollPos. Estas propriedades permitem que você vá obter e definir a posição da barra de rolagem horizontal e vertical em seu controle.

Passo 2:. Crie um formulário de teste e experimentar o seu controle

Criar um Winform no mesmo projeto como o controle personalizado. Largar o controle personalizado na forma de teste e adicionar um botão no formulário. No formulário de evento Click, adicione o seguinte código para exibir posição de rolagem vertical do seu controle personalizado.

Console.WriteLine(myRichTextBox1.VScrollPos)

Algumas coisas a observar:

  1. Se o seu controle não está neste momento exibindo uma barra de rolagem vertical, a chamar a HScrollPos irá travar o seu programa. Há alguns, obviamente, maneiras de contornar isso (verificação de que o barra de rolagem está sendo exibido antes verificando a propriedade, ou fazer a barra de rolagem vertical sempre visível, etc.).

  2. Dependendo de como o controle (e possivelmente forma) é dimensionado (não mudanças menção no conteúdo de texto do controlo), definindo o VScrollPos pode travar o seu programa ou não restaurá-lo para o que posição estava quando o valor VScrollPos foi Salvo.

  3. Eu nunca usei esse código. Eu pensei que sua pergunta foi interessante e fez um pouco de investigação para chegar a minha resposta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top