我正在使用C#
创建Windows窗体应用程序我需要一个灰色的复选框,直到用户滚动到文本框的底部。
如何获取文本框滚动条位置的值?
答案 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。