2009-10-25 5 views

Répondre

2

Je ne connais aucun moyen de le faire sans PInvoke. Vous pouvez utiliser PInvoke pour appeler le 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 

Cela 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 de la barre de défilement horizontale et verticale dans votre contrôle.

Étape 2: Créez un formulaire d'essai et tentez votre contrôle.

Créez un Winform dans le même projet que votre contrôle personnalisé. Déposez le contrôle personnalisé dans le 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 choses à surveiller:

  1. Si votre commande est pas l'affichage d'une barre de défilement vertical, l'appel à HScrollPos va planter votre programme . Il y en a évidemment quelques-unes (vérifiez que la barre de défilement est affichée avant en vérifiant la propriété, ou en rendant la barre de défilement verticale toujours visible, etc.).

  2. Selon la façon dont le contrôle (et éventuellement sous forme) est dimensionné (sans mention des changements dans le contenu du texte du contrôle), le réglage des VScrollPos peut planter votre programme ou pas restaurer à la position était dans lorsque la valeur VScrollPos a été enregistrée .

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

+0

Fonctionne bien !!! Merci beaucoup! Je me demande pourquoi ils n'ont pas créé un emballage pour cette méthode, ça aurait du sens lol. Je souhaite que je pourrais upvote plus d'une fois! – Cyclone

+0

Bon, je suis content que ça a aidé. –

+0

salut :) J'ai essayé votre code et il fonctionne très bien pour obtenir la valeur, mais pour définir une nouvelle valeur pour le faire défiler, il ne fait que redessiner la barre de défilement de ce contrôle :(pourriez-vous aider? Voici ce que je fais: http: // pastesite .com/22927 merci :) – FeRtoll