Obter posição da barra de deslocamento vertical como um número inteiro vb.net
-
06-07-2019 - |
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!
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:
-
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.).
-
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.
-
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.