gpt4 book ai didi

c# - 检查 RichTextBox ScrollBar thumb 是否在滚动条的底部

转载 作者:行者123 更新时间:2023-12-04 00:46:53 27 4
gpt4 key购买 nike

我找到了这个链接 WPF_Example , 但它是用 WPF 编写的。我不是在 WPF 中编程,而是在 Windows 窗体中进行编程,没有真正的理由想要将 WPF RichTextBox 嵌入到我的应用程序中以获得我需要的答案。

有没有办法使用 WindowsForms(不是 WPF)来确定 RichTextBox 滚动条 slider 是否位于滚动条的底部?

这样做的目的是让正在 RTF 框中查看聊天的用户向上滚动,并且在添加文本时,如果向上滚动则不向下滚动。想一想 mIRC 如何处理聊天;如果您在聊天框的底部,文本将自动滚动到 View 中;即使向上移动一行,也无需滚动即可添加文本。

我需要复制它。我确实在 SO 上找到了这个链接:List_ViewScroll ,但我不确定它是否适用于这种情况。

任何帮助将不胜感激:)

决议

使用这个类,我能够让它工作。非常感谢下面的人指出,并澄清了一些:

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;
}

最佳答案

所以,这个问题的答案并不复杂,但相当冗长。关键是 Win32 API 函数 GetScrollBarInfo,它很容易从 C# 调用。您需要在表单中定义以下定义才能进行调用...

[DllImport("user32.dll", SetLastError = true, EntryPoint = "GetScrollBarInfo")]
private static extern int GetScrollBarInfo(IntPtr hWnd,
uint idObject, ref SCROLLBARINFO psbi);

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;
}

要测试 GetScrollBarInfo,请考虑创建一个带有 RichTextBox 和一个按钮的表单。在按钮的点击事件中,进行以下调用(假设您的 RichTextBox 名为“richTextBox1”)...

uint OBJID_VSCROLL = 0xFFFFFFFB;

SCROLLBARINFO info = new SCROLLBARINFO();
info.cbSize = Marshal.SizeOf(info);

int res = GetScrollBarInfo(richTextBox1.Handle, OBJID_VSCROLL, ref info);
bool isAtBottom = info.xyThumbBottom >
(info.rcScrollBar.Bottom - info.rcScrollBar.Top - 20);

调用后,一个简单的公式就可以判断滚动条拇指是否在底部。本质上,info.rcScrollBar.Bottominfo.rcScrollBar.Top 是屏幕上的位置,它们之间的差异将告诉您滚动条的大小,无论它在哪里在屏幕上。同时,info.xyThumbBottom 标记了拇指按钮底部的位置。 “20”基本上是对滚动条向下箭头大小的猜测。你看,拇指按钮的底部实际上永远不会一直到滚动条的底部,(这是不同之处)所以你必须为向下按钮减去额外的数量。鉴于按钮的大小会根据用户的配置而有所不同,这确实有些不稳定,但这应该足以让您入门。

关于c# - 检查 RichTextBox ScrollBar thumb 是否在滚动条的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7843794/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com