I found this link WPF_Example, but it is written in WPF. I am not programming in WPF, I am doing this in Windows Forms, and have no real reason to want to embed a WPF RichTextBox into my app just to obtain the answer I need.
Is there not a way, using WindowsForms (NOT WPF), to figure out if the RichTextBox scroll-bar thumb is at the bottom of the scroll bar?
The purpose of this is to allow our users, who are viewing the chat in the RTF box, to scroll up, and when text is added, NOT SCROLL DOWN, if they are scrolled up. Think of how mIRC handles chat; if you are at the bottom of the chat box, text will auto scroll into view; if you move up even one line, text is added w/o having to scroll.
I need to replicate that. I did find this link here on SO: List_ViewScroll, but i am not sure if it applies in this case.
Any help would be greatly appriciated 🙂
RESOLUTION
Using this class, I was able to get it to work. Thank you very much to the person below who pointed it out, and clarified some bits of it:
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;
}
So, the answer to this question is not incredibly complicated, but it is fairly verbose. The key is the Win32 API function GetScrollBarInfo, which is fairly easy to call from C#. You’ll need to the following definitions in your form to make the call…
To test out GetScrollBarInfo, consider creating a form with a RichTextBox and a button. In the click event for the button, make the following call (assuming your RichTextBox is named “richTextBox1”)…
After the call, a simple formula can determine whether or not the scroll bar thumb is at the bottom. Essentially, info.rcScrollBar.Bottom and info.rcScrollBar.Top are positions on the screen and the difference between them will tell you the size of the scroll bar no matter where it is on the screen. Meanwhile, info.xyThumbBottom marks the position of the bottom of the thumb button. The “20” is basically guess as to the size of the scroll bar’s down arrow. You see, the bottom of the thumb button will never actually be all the way to the bottom of the scroll bar, (which is what the difference gives you) so you have to take off an additional amount for the down button. This is admittedly somewhat volatile given that the button’s size will be different depending on users’ configuration, but this should be enough to get you started.