获取Winforms文本框(C#)的滚动条滚动的值

时间:2015-04-21 08:45:28

标签: c# winforms textbox scrollbar

我正在使用C#

创建Windows窗体应用程序

我需要一个灰色的复选框,直到用户滚动到文本框的底部。

如何获取文本框滚动条位置的值?

2 个答案:

答案 0 :(得分:1)

这应该是RichTextBox,因此您可以使用其SelectionProtected属性来确保用户无法更改文本。它没有Scroll事件,但可以通过重写WndProc()并检测WM_VSCROLL消息来添加。除非WordWrap属性设置为False,否则检查最后一行是否像@TaW一样可见是不可靠的。更容易检查滚动条的状态。

在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖放到表单上。订阅LicenseViewed事件并设置复选框'已启用属性 true 。如果我没有指出只有律师认为这是一个好主意,用户会发现这些文本框普遍令人烦恼并且充满激情地恨他们,我会失职。您只有一次机会创造良好的第一印象。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

class LicenseBox : RichTextBox {
    public event EventHandler LicenseViewed;

    public override string Text {
        get { return base.Text; }
        set { base.Text = value;  textChanged(); }
    }

    public new string Rtf {
        get { return base.Rtf; }
        set { base.Rtf = value; textChanged(); }
    }

    private bool eventFired;

    private void textChanged() {
        this.SelectAll();
        this.SelectionProtected = true;
        this.SelectionStart = this.SelectionLength = 0;
        eventFired = false;
        checkScrollbar();
    }

    private void checkScrollbar() {
        if (eventFired || !this.IsHandleCreated) return;
        var pos = new ScrollInfo();
        pos.cbSize = Marshal.SizeOf(pos);
        pos.fMask = 7;
        if (!GetScrollInfo(this.Handle, SB_VERT, ref pos)) return;
        if (pos.nPos >= pos.nMax - pos.nPage) {
            if (LicenseViewed != null) LicenseViewed(this, EventArgs.Empty);
            eventFired = true;
        }
    }

    protected override void WndProc(ref Message m) {
        base.WndProc(ref m);
        if (m.Msg == WM_VSCROLL || m.Msg == WM_MOUSEWHEEL) checkScrollbar();
    }

    // Pinvoke
    private const int WM_VSCROLL = 0x115;
    private const int WM_MOUSEWHEEL = 0x20A;
    private const int SB_VERT = 1;
    private struct ScrollInfo {
        public int cbSize, fMask, nMin, nMax, nPage, nPos, nTrackPos;
    }
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool GetScrollInfo(IntPtr hwnd, int bar, ref ScrollInfo pos);

}

答案 1 :(得分:0)

这是一个告诉你最后一行是否可见的函数:

bool LastLineVisible(TextBox textbox)
{
    Point lowPoint = new Point(3, textbox.ClientSize.Height - 3);
    int lastline = textbox.Lines.Count() - 1;
    int charOnLastvisibleLine = textbox.GetCharIndexFromPosition(lowPoint);
    int lastVisibleLine = textbox.GetLineFromCharIndex(charOnLastvisibleLine);
    return lastVisibleLine >= lastline;
}

您仍然需要检测滚动事件本身。有关如何检测滚动的信息,请参阅here