控制 RichTextBox 中的水平滚动

Posted

技术标签:

【中文标题】控制 RichTextBox 中的水平滚动【英文标题】:Controlling horizontal scroll in RichTextBox 【发布时间】:2009-11-24 18:37:20 【问题描述】:

我有一个 RichTextBox,我正在向其中发送日志信息,但 RichTextBox 似乎想要在附加的文本太长而无法容纳时水平滚动。

经过广泛搜索,并反复以ScrollToCaret() 失败,似乎此函数控制垂直滚动位置,而不是水平滚动位置。我还尝试使用 API 调用 GetScrollRange()SetScrollPos(),虽然它们确实将滚动条放置在正确的位置,但它们并没有控制 RichTextBox 滚动的实际位置。

【问题讨论】:

【参考方案1】:

会不会是日志中每条日志信息的末尾都没有换行呢?使用 System.Environment.Newline 附加到每行的末尾,然后再将其放入richtextbox。看看 CodeProject 上的这个article,它可能会对您有所帮助并让您朝着正确的方向前进。

希望这会有所帮助, 最好的祝福, 汤姆。

【讨论】:

最初,当我附加文本时,我正在执行 Environment.NewLine + 文本。我把它换了,现在 ScrollToCaret() 就可以了。当然,这并不像我想要的那样优雅(RTB 底部的额外行真的让我很困扰),但无需担心导入任何内容。谢谢!【参考方案2】:

这有点乱,但应该可以: 当您执行 ScrollToCaret 并且水平滚动位置发生更改时,它会触发 HScroll 事件。如果您不希望发生 HScroll 事件,您可以将水平滚动条向后移动 1.将selectionstart移动到前一个crlf之后1个字符 2.将 selectionstart 设置为该位置,然后 3. ScrollToCaret。

【讨论】:

【参考方案3】:

跳转到ReadOnly RichTextBox最后一行开头的简单方法

加油!这就是我所做的。我使用富文本框作为日志显示,因此它不断接收附加到文本底部的新字符串,并且字符串总是比富文本框的宽度长。我想让最后一行始终显示,但在行的开头而不是结尾。

我添加了一个TextChanged 事件处理程序(您可以在富文本框的属性面板中获得它)。 vbcrlf 确保最后一行始终为空行,并且由于该行中没有文本,ScrollToCaret() 将自动位于第一个字符处。除非您打开了 textwrap,否则请确保将滚动条属性设置为 both,以便用户可以滚动查看行的另一端的内容。

请注意,此解决方案仅适用于只读富文本框。如果它不是只读的并且用户在其中输入,则每个字符都将结束起来就自己行了!将readonly 设置为true,,您的程序仍然可以更改文本 - 只是用户无法更改,最后输入的行将始终是可见的!

 Private Sub my_richtextbox_TextChanged( sender As System.Object,  e As System.EventArgs) Handles my_richtextbox.TextChanged
    With my_richtextbox
        .Text = .Text & vbcrlf
        .SelectionStart = .Text.Length
        .ScrollToCaret()
    End With
End sub

【讨论】:

以上是关于控制 RichTextBox 中的水平滚动的主要内容,如果未能解决你的问题,请参考以下文章

C#,RichTextBox:如何实现逐行滚动?

十万火急!VB6.0中的RichTextBox文本如何设置出现滚动条!!!

vb.net中如何控制richtextbox垂直滚动条向下滚动

如何编程控制vb2005的richtextbox的滚动条进行自由滚动?

WPF RichTextBox 控件常用方法和属性

VB里的 RichTextBox 滚动条