控制 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 中的水平滚动的主要内容,如果未能解决你的问题,请参考以下文章
十万火急!VB6.0中的RichTextBox文本如何设置出现滚动条!!!
vb.net中如何控制richtextbox垂直滚动条向下滚动