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

Che*_*eso 10 scroll richtextbox winforms

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

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

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

编辑:

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

引人注目的是,还有EM_GETFIRSTVISIBLELINE,它获得了第一条可见线,但我找不到GETLASTVISIBLELINE.??


相关:
如何将插入符号滚动到RichTextBox的中间?

Ste*_*bob 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
Run Code Online (Sandbox Code Playgroud)

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