9

私はインターネットを広範囲に検索し、このような多くの質問を見てきましたが、実際の答えは見ていません。

たくさんのテキストが入ったリッチテキストボックスコントロールがあります。このコントロールにはいくつかの法的情報があります。デフォルトでは、[同意する]ボタンは無効になっています。スクロールイベントで、Vスクロールバーの位置が一番下にあるかどうかを検出したいと思います。下部にある場合は、ボタンを有効にします。

現在のVスクロールバーの位置をどのように検出しますか?

ありがとう!

編集 私はWinForms(.Net 4.0)を使用しています

4

3 に答える 3

18

これにより、探しているものに近づくことができます。このクラスは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;
}

必要に応じて微調整します。

于 2012-04-20T00:32:23.813 に答える
6

以下は、私のソリューションの1つで非常にうまく機能します。

Point P = new Point(rtbDocument.Width, rtbDocument.Height);
int CharIndex = rtbDocument.GetCharIndexFromPosition(P);

if (rtbDocument.TextLength - 1 == CharIndex)
{
   btnAccept.Enabled = true;
}
于 2016-07-15T11:05:52.267 に答える
5

質問RichTextBoxのスクロール位置を取得するにはどうすればよいですか? 役に立つかもしれません、この機能をチェックしてください

   richTextBox1.GetPositionFromCharIndex(0);
于 2012-04-19T23:41:51.987 に答える