Question

J'ai une RichTextBox et je dois trouver la position de la barre de défilement verticale.

Y at-il un moyen de faire cela sans Pinvoke? Sinon, comment faire avec Pinvoke?

Je dois renvoyer une valeur entière.

Merci pour l'aide!

Était-ce utile?

La solution

Je ne sais pas comment faire cela sans PInvoke. Vous pouvez utiliser PInvoke pour appeler GetScrollPos .

Voici comment vous pouvez l'essayer.

Étape 1: créez un contrôle RichTextBox personnalisé en étendant 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

Ceci ajoutera deux propriétés à un RichTextBox standard: HScrollPos et VScrollPos. Ces propriétés vous permettront d’obtenir et de définir la position des barres de défilement horizontale et verticale dans votre contrôle.

Étape 2: créez un formulaire de test et testez votre contrôle.

Créez un Winform dans le même projet que votre contrôle personnalisé. Supprimez le contrôle personnalisé du formulaire de test et ajoutez un bouton sur le formulaire. Dans l'événement Click du formulaire, ajoutez le code suivant pour afficher la position de défilement vertical de votre contrôle personnalisé.

Console.WriteLine(myRichTextBox1.VScrollPos)

Quelques points à surveiller:

  1. Si votre contrôle n'est pas actuellement affichant une barre de défilement verticale, le appel à HScrollPos plantera votre programme. Il y en a évidemment façons de contourner le problème (vérifiez que le la barre de défilement est affichée avant vérifier la propriété, ou faire la barre de défilement verticale toujours visible, etc.).

  2. En fonction de la manière dont le contrôle (et     éventuellement forme) est dimensionné (ne pas     mentionner les changements dans le contenu du texte     du contrôle), en réglant la     VScrollPos peut planter votre programme ou     pas le restaurer à la position qu'il     était dans lorsque la valeur de VScrollPos était     enregistré.

  3. Je n'ai jamais utilisé ce code. je     pensais que votre question était     intéressant et a fait un peu de     recherche pour trouver ma réponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top