c# - 如何知道RichTextBox垂直Scrollbar是否达到最大值?

标签 c# .net vb.net winforms richtextbox

当使用 richtextbox 方法“ScrollToCaret”时,我需要知道滚动条是否到达了顶部/底部边距。

这是因为当垂直滚动条完全滚动到底部时,如果我再次使用“ScrollToCaret”方法,那么它会在控件中产生奇怪的视觉效果,因为它尝试并重试向下滚动,但没有更多内容可以滚动,我无法理解 richtextbox 控件的这种奇怪逻辑。

我希望你能理解我,原谅我的英语。

PS:我使用的是默认的 richtextbox 垂直滚动条。

最佳答案

你必须稍微处理一下“Win32”。
“win32”中的“GetScrollInfo”方法就是您要找的。
使用“GetScrollInfo”方法,您可以获得以下 RichTextBox 滚动属性:

  • 最大范围,
  • 现职
  • 缩略图大小(即 RichTextBox“页面”大小)。

公式:
Max Position = Max Range - Thumb size

请看下面的例子:

// Add the reference:
// using System.Runtime.InteropServices;

// Define an extension method for this purpose:
public static class RichTextBoxExtension
{
    [DllImport("user32")]
    private static extern int GetScrollInfo(IntPtr hwnd, int nBar, 
                                            ref SCROLLINFO scrollInfo);

    public struct SCROLLINFO
    {
      public int cbSize;
      public int fMask;
      public int min;
      public int max;
      public int nPage;
      public int nPos;
      public int nTrackPos;
    }

    public static bool ReachedBottom(this RichTextBox rtb)
    {
       SCROLLINFO scrollInfo = new SCROLLINFO();
       scrollInfo.cbSize = Marshal.SizeOf(scrollInfo);
       //SIF_RANGE = 0x1, SIF_TRACKPOS = 0x10,  SIF_PAGE= 0x2
       scrollInfo.fMask = 0x10 | 0x1 | 0x2;
       GetScrollInfo(rtb.Handle, 1, ref scrollInfo);//nBar = 1 -> VScrollbar
       return scrollInfo.max == scrollInfo.nTrackPos + scrollInfo.nPage;
    }
}

//Usage:
if (!yourRichTextBox.ReachedBottom())
{
   yourRichTextBox.ScrollToCaret();
   //...
}

关于c# - 如何知道RichTextBox垂直Scrollbar是否达到最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343794/

相关文章:

c# - Serializable 和 MarshalByRefObject 之间的区别

.net - 是否存在实现 luac 功能的 .NET DLL?

c# - 错误 MSB4018 : The "ResolveSdks" monodevelop

c# - .NET 自定义 MembershipProvider 解密密码

mysql - 获取sql后检索DataRow

c# - 所选项目更改时如何从列表框中检索所有数据

c# - 我应该如何验证 MVC3 页面的不同部分

c# - 如何限制文本框仅接受特定字符

.net - 将空字符串分配给当前值为空的属性

c# - DelegateCommand 在哪个命名空间中?