我找到了这个链接WPF_Example,但它是用WPF编写的。我不会在WPF中编程,我正在使用Windows Forms,没有真正的理由想嵌入一个WPF RichTextBox到我的应用程序中,只是为了得到我需要的答案。
是否有一种方法,使用WindowsForms(而非WPF),来确定RichTextBox滚动条拇指是否位于滚动条底部?
其目的是允许我们的用户在RTF框中查看聊天记录时向上滚动,当添加文本时,如果他们向上滚动,则不要向下滚动。 想象一下mIRC如何处理聊天; 如果您在聊天框底部,文本将自动滚动到视图中; 如果您向上移动一行,文本将添加而无需滚动。
我需要复制这个功能。 我确实在SO上找到了这个链接:List_ViewScroll,但我不确定它是否适用于此情况。
任何帮助都将不胜感激 :)
RESOLUTION
使用这个类,我能够让它工作。 非常感谢下面的人指出并澄清了一些细节:
是否有一种方法,使用WindowsForms(而非WPF),来确定RichTextBox滚动条拇指是否位于滚动条底部?
其目的是允许我们的用户在RTF框中查看聊天记录时向上滚动,当添加文本时,如果他们向上滚动,则不要向下滚动。 想象一下mIRC如何处理聊天; 如果您在聊天框底部,文本将自动滚动到视图中; 如果您向上移动一行,文本将添加而无需滚动。
我需要复制这个功能。 我确实在SO上找到了这个链接:List_ViewScroll,但我不确定它是否适用于此情况。
任何帮助都将不胜感激 :)
RESOLUTION
使用这个类,我能够让它工作。 非常感谢下面的人指出并澄清了一些细节:
internal class Scrollinfo
{
public const uint ObjidVscroll = 0xFFFFFFFB;
[DllImport("user32.dll", SetLastError = true, EntryPoint = "GetScrollBarInfo")]
private static extern int GetScrollBarInfo(IntPtr hWnd,
uint idObject,
ref Scrollbarinfo psbi);
internal static bool CheckBottom(RichTextBox rtb)
{
var info = new Scrollbarinfo();
info.CbSize = Marshal.SizeOf(info);
var res = GetScrollBarInfo(rtb.Handle,
ObjidVscroll,
ref info);
var isAtBottom = info.XyThumbBottom > (info.RcScrollBar.Bottom - info.RcScrollBar.Top - (info.DxyLineButton*2));
return isAtBottom;
}
}
public struct Scrollbarinfo
{
public int CbSize;
public Rect RcScrollBar;
public int DxyLineButton;
public int XyThumbTop;
public int XyThumbBottom;
public int Reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
public int[] Rgstate;
}
public struct Rect
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}