Frage

Ich habe eine RichTextBox und ich brauche die Position der vertikalen Bildlaufleiste zu finden.

Gibt es eine Möglichkeit, dies ohne Pinvoke zu tun? Wenn nicht, was ist eine Möglichkeit, dies mit Pinvoke zu tun?

Ich brauche einen Integer-Wert zurück.

Danke für die Hilfe!

War es hilfreich?

Lösung

Ich kenne keine Möglichkeit, dies zu tun, ohne PInvoke. Sie können PInvoke verwenden, um rufen GetScrollPos .

Hier ist, wie Sie können es versuchen.

Schritt 1:. Erstellen Sie eine benutzerdefinierte RichTextBox Steuerung durch einen Standard-RichTextBox erstreckt

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

Dies wird zwei Eigenschaften einer Standard-RichTextBox hinzu: HScrollPos und VScrollPos. Diese Eigenschaften können Sie gehen bekommen und stellen Sie die horizontale und vertikale Bildlaufposition in Ihrer Kontrolle.

Schritt 2:. ein Test Formular erstellen und Ihre Steuerung ausprobieren

Erstellen Sie eine Winform im selben Projekt wie das benutzerdefinierte Steuerelement. Lassen Sie die individuelle Steuerung in der Testform und fügen Sie auf dem Formular eine Schaltfläche. In dem Click-Ereignis des Formulars den folgenden Code Ihrer benutzerdefinierten Steuerelements vertikale Bildlaufposition zu sehen.

Console.WriteLine(myRichTextBox1.VScrollPos)

Ein paar Dinge zu beachten gilt:

  1. Wenn Sie Ihre Steuerung ist nicht eine vertikale Bildlaufleiste angezeigt wird, die rufen HScrollPos stürzt Ihr Programm. Es gibt ein paar offensichtlich um diese Möglichkeiten (prüfen, ob die Scrollbar angezeigt wird, bevor Überprüfung der Eigenschaft, oder machen die vertikale Bildlaufleiste immer sichtbar, usw.).

  2. Je nachdem, wie die Kontrolle (und     möglicherweise Form) ist so bemessen (nicht     erwähnen Änderungen in den Textinhalt     der Kontrolle), das Setzen der     VScrollPos kann Ihr Programm zum Absturz bringen oder     wiederherstellen es nicht in die Position es     in war, als der VScrollPos Wert war     gespeichert.

  3. Ich habe noch nie diesen Code verwendet. ich     dachte Ihre Frage war,     interessant und hat ein wenig     Forschung zu kommen mit meiner Antwort.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top