Obtenir la position de défilement actuelle du contrôle de zone de texte enrichi?

J’ai parcouru l’internet de très loin et j’ai vu de nombreuses questions de ce type, mais je n’ai pas vu de réponse réelle.

J’ai un contrôle de zone de texte riche avec beaucoup de texte. Il a quelques informations légales dans ce contrôle. Par défaut, le bouton “Accepter” est désactivé. Je veux détecter sur l’événement de défilement si la position de la barre de défilement est en bas. Si c’est en bas, activez le bouton.

Comment pourrais-je détecter la position actuelle de la barre de v-scroll?

Je vous remercie!

EDIT J’utilise WinForms (.Net 4.0)

Cela devrait vous rapprocher de ce que vous recherchez. Cette classe hérite de la classe RichTextBox et utilise des mots-clés pour déterminer la position de défilement. Il ajoute un événement ScrolledToBottom qui est déclenché si l’utilisateur fait défiler à l’aide de la barre de défilement ou utilise le clavier.

 public class RTFScrolledBottom : RichTextBox { public event EventHandler ScrolledToBottom; private const int WM_VSCROLL = 0x115; private const int WM_MOUSEWHEEL = 0x20A; private const int WM_USER = 0x400; private const int SB_VERT = 1; private const int EM_SETSCROLLPOS = WM_USER + 222; private const int EM_GETSCROLLPOS = WM_USER + 221; [DllImport("user32.dll")] private static extern bool GetScrollRange(IntPtr hWnd, int nBar, out int lpMinPos, out int lpMaxPos); [DllImport("user32.dll")] private static extern IntPtr SendMessage(IntPtr hWnd, Int32 wMsg, Int32 wParam, ref Point lParam); public bool IsAtMaxScroll() { int minScroll; int maxScroll; GetScrollRange(this.Handle, SB_VERT, out minScroll, out maxScroll); Point rtfPoint = Point.Empty; SendMessage(this.Handle, EM_GETSCROLLPOS, 0, ref rtfPoint); return (rtfPoint.Y + this.ClientSize.Height >= maxScroll); } protected virtual void OnScrolledToBottom(EventArgs e) { if (ScrolledToBottom != null) ScrolledToBottom(this, e); } protected override void OnKeyUp(KeyEventArgs e) { if (IsAtMaxScroll()) OnScrolledToBottom(EventArgs.Empty); base.OnKeyUp(e); } protected override void WndProc(ref Message m) { if (m.Msg == WM_VSCROLL || m.Msg == WM_MOUSEWHEEL) { if (IsAtMaxScroll()) OnScrolledToBottom(EventArgs.Empty); } base.WndProc(ref m); } } 

Voici comment cela peut être utilisé:

 public Form1() { InitializeComponent(); rtfScrolledBottom1.ScrolledToBottom += rtfScrolledBottom1_ScrolledToBottom; } private void rtfScrolledBottom1_ScrolledToBottom(object sender, EventArgs e) { acceptButton.Enabled = true; } 

Tweak si nécessaire.

La question Comment obtenir la position de défilement pour RichTextBox? pourrait être utile, Découvrez cette fonction

  richTextBox1.GetPositionFromCharIndex(0); 

Ce qui suit fonctionne très bien dans l’une de mes solutions:

 Point P = new Point(rtbDocument.Width, rtbDocument.Height); int CharIndex = rtbDocument.GetCharIndexFromPosition(P); if (rtbDocument.TextLength - 1 == CharIndex) { btnAccept.Enabled = true; }