2012-04-19 37 views
4

私はインターネットを広範囲に検索し、このような多くの質問を見ましたが、私は実際の答えを見ていません。リッチテキストボックスコントロールから現在のスクロール位置を取得しますか?

多くのテキストを含むリッチテキストボックスコントロールがあります。このコントロールにはいくつかの法的情報があります。デフォルトでは、「承認」ボタンは無効になっています。私はスクロールイベントで、スクロールバーの位置が下にあるかどうかを検出したい。下部にある場合は、ボタンを有効にします。

現在のvスクロールバーの位置はどのように検出されますか?

ありがとうございました!

EDIT私はWinFormsの(.NET 4.0)

+0

のWinFormsやWPF? –

+0

WinForms、.net 4.0を使用 –

+2

これはタグに入れるのが最適です。 –

答えて

12

この機能をチェックしてください。このクラスは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; 
} 

は、必要に応じて微調整。

+0

ありがとう! –

+0

ユーザーがスクロールバーを押しながら移動している間は、スクロール位置は更新されません。マウスボタンが離された後でなければなりません。 –

+0

'this.ClientSize.Height'をスクロール位置に追加する必要がある理由を説明してください。スクロールが最下部にあってもスクロール位置が 'maxScroll'に等しくないのはなぜですか? –

2

私の解決策の一つで、非常によく、次の作品:

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

if (rtbDocument.TextLength - 1 == CharIndex) 
{ 
    btnAccept.Enabled = true; 
} 
関連する問題