Получить текущую позицию прокрутки из элемента управления rich text box?
Я искал в интернете повсюду и видел много вопросов, подобных этому, но я не видел реального ответа.
У меня есть элемент управления rich text box с большим количеством текста в нем. У него есть некоторая юридическая информация в этом контроле. По умолчанию кнопка "принять" отключена. Я хочу определить на событии прокрутки, если положение полосы прокрутки v находится внизу. Если он находится внизу, включите кнопку.
Как бы я определил текущее положение полосы прокрутки v?
Спасибо Ты!
EDIT Я использую WinForms (.Net 4.0)
3 ответа:
Это должно приблизить вас к тому, что вы ищете. Этот класс наследуется от RichTextBox и использует некоторые pinvoking для определения положения прокрутки. Он добавляет событие
ScrolledToBottom
, которое срабатывает, если пользователь прокручивает с помощью полосы прокрутки или использует клавиатуру.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); } }
Вот как он может быть использован:
public Form1() { InitializeComponent(); rtfScrolledBottom1.ScrolledToBottom += rtfScrolledBottom1_ScrolledToBottom; } private void rtfScrolledBottom1_ScrolledToBottom(object sender, EventArgs e) { acceptButton.Enabled = true; }
Настроить по мере необходимости.
Вопрос Как получить позицию прокрутки для RichTextBox? может быть полезно, проверьте эту функцию
richTextBox1.GetPositionFromCharIndex(0);