Domanda

Ho un RichTextBox e devo trovare la posizione della barra di scorrimento verticale.

Esiste un modo per farlo senza Pinvoke? In caso contrario, qual è un modo per farlo CON Pinvoke?

Devo restituire un valore intero.

Grazie per l'aiuto!

È stato utile?

Soluzione

Non conosco alcun modo per farlo senza PInvoke. Puoi usare PInvoke per chiamare GetScrollPos .

Ecco come puoi provarlo.

Passaggio 1: crea un controllo RichTextBox personalizzato estendendo un RichTextBox standard.

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

Ciò aggiungerà due proprietà a un RichTextBox standard: HScrollPos e VScrollPos. Queste proprietà ti permetteranno di ottenere e impostare la posizione della barra di scorrimento orizzontale e verticale nel tuo controllo.

Passaggio 2: crea un modulo di prova e prova il tuo controllo.

Crea un Winform nello stesso progetto del tuo controllo personalizzato. Rilascia il controllo personalizzato nel modulo di test e aggiungi un pulsante sul modulo. Nell'evento Click del modulo, aggiungi il seguente codice per visualizzare la posizione di scorrimento verticale del controllo personalizzato.

Console.WriteLine(myRichTextBox1.VScrollPos)

Alcune cose da cercare:

  1. Se il controllo non è attualmente mostrando una barra di scorrimento verticale, il la chiamata a HScrollPos si interromperà programma. Ce ne sono alcuni ovviamente modi per aggirare questo (verificare che il la barra di scorrimento viene visualizzata prima controllando la proprietà o effettuando il barra di scorrimento verticale sempre visibile, ecc.).

  2. A seconda di come il controllo (e     possibilmente forma) è dimensionato (non per     menzionare i cambiamenti nei contenuti del testo     del controllo), impostando il     VScrollPos può causare l'arresto anomalo del programma o     non ripristinarlo nella posizione     era quando era il valore VScrollPos     salvato.

  3. Non ho mai usato questo codice. io     pensavo che la tua domanda fosse     interessante e ha fatto un po 'di     ricerca per trovare la mia risposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top