Winforms RichTextBox:如何确定可见的文本行数?

时间:2009-11-20 21:57:53

标签: winforms richtextbox scroll

我有一个包含RichTextBox的Winforms应用程序。

如何确定当前可见的文本行数?

原因:我想将插入符号滚动到RichTextBox的中间。我可以使用RichTextBox.ScrollToCaret(),但这会将插入符号放在RichTextBox的顶部。我想,如果我知道显示了多少行,我可以将插入符号“后退”移动n / 2行,然后调用ScrollToCaret(),然后恢复原始插入位置。

修改

我找到了EM_GETLINECOUNT,我认为这是答案,除了文档说: EM_GETLINECOUNT消息检索文本行的总数,而不仅仅是当前可见的行数。

诱人地,还有EM_GETFIRSTVISIBLELINE,它获得了第一条可见线,但我找不到GETLASTVISIBLELINE。 ??


相关:
How can I scroll the caret to the middle of the RichTextBox?

2 个答案:

答案 0 :(得分:16)

嗯,这不是很好,但它对我有用。基本上我正在检查richtextbox左上角内的一个点和文本框左下角内的一个点。您可能必须根据richtextbox的显示方式调整点坐标。然后我得到最接近这两个点的字符索引,并检索它所在的行。

Dim topIndex As Integer = RichTextBox1.GetCharIndexFromPosition(New Point(1, 1))
Dim bottomIndex As Integer = RichTextBox1.GetCharIndexFromPosition(New Point(1, RichTextBox1.Height - 1))

Dim topLine As Integer = RichTextBox1.GetLineFromCharIndex(topIndex)
Dim bottomLine As Integer = RichTextBox1.GetLineFromCharIndex(bottomIndex)

Dim numLinesDisplayed As Integer = bottomLine - topLine

我为富文本框测试了它,显示了多种大小的字体,它似乎有效。我怀疑如果显示的文本的最后一行在其下面有很多空白并且下一行几乎准备好显示,则返回的答案将被关闭(太小)一行。如果你有一个非常高的richtextbox,有许多行,这应该不是问题。

答案 1 :(得分:0)

要显示RichTextBox能够显示的行数,即使当前没有文本,请尝试:

Dim s As SizeF = TextRenderer.MeasureText("A", rtb.Font, rtb.Size, TextFormatFlags.WordBreak)
Dim letterHeight As Integer = CInt(s.Height)
Dim displayableLines As Integer = rtb.Height / letterHeight

这使用当前字体中测试字母“A”的高度来查找以像素为单位的行高。