C # - как отобразить флажок, когда пользователь прокручивается в нижней части богатого текстового поля [дубликат]

Вы должны использовать метод appendChild .

box2.appendChild(box1);

4
задан Landin Martens 19 April 2012 в 23:39
поделиться

3 ответа

Это должно приблизиться к тому, что вы ищете. Этот класс наследуется от RichTextBox и использует определенный вывод для определения положения прокрутки. Он добавляет событие 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;
}

При необходимости отрегулируйте.

12
ответ дан LarsTech 18 August 2018 в 21:04
поделиться
  • 1
    Бесконечно благодарен!! – Landin Martens 20 April 2012 в 04:12
  • 2
    Обратите внимание, что положение прокрутки не обновляется, когда пользователь удерживает полосу прокрутки и перемещает ее. Только после отпускания кнопки мыши. – Mr Universe 26 July 2013 в 02:59
  • 3
    Не могли бы вы объяснить, почему нам нужно добавить this.ClientSize.Height в положение прокрутки? Почему положение прокрутки не равно maxScroll, даже если свиток находится в самом низу? – Dmitry Erokhin 3 September 2013 в 06:45
  • 4
    @DmitryErokhin Хороший вопрос. MinScroll и maxScroll дают диапазон прокрутки, но он компенсируется размером элемента управления, который для вертикальной полосы прокрутки является высотой элемента управления. В принципе, rtfPoint.Y никогда не будет равняться maxScroll, если в игре есть диапазон прокрутки из-за этого смещения по размеру. – LarsTech 3 September 2013 в 14:19

Вопрос Как получить положение прокрутки для RichTextBox? может быть полезно, проверьте эту функцию

   richTextBox1.GetPositionFromCharIndex(0);
2
ответ дан Community 18 August 2018 в 21:04
поделиться
2
ответ дан RooiWillie 18 August 2018 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: