在RichTextBox中控制水平滚动

时间:2009-11-24 18:37:21

标签: c# winforms richtextbox

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

轻松跳转到ReadOnly RichTextBox最后一行的开头

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

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

请注意,此解决方案仅适用于只读 richtext框。如果它不是只读且用户输入,则每个字符都将结束靠自己的路线!将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