Winforms RichTextBox: как определить, сколько строк текста видно?
У меня есть приложение Winforms, содержащее RichTextBox.
Как я могу определить, сколько строк текста отображаются, в настоящее время видны?
причина: я хочу прокрутить курсор до середины RichTextBox. Я могу использовать управления richtextbox.ScrollToCaret (), но это ставит курсор в верхней части RichTextBox. Я полагаю, если я знаю, сколько строк отображается, я мог бы переместить курсор "назад" N / 2 строки, затем вызвать ScrollToCaret (), а затем восстановить исходное положение каретки.
EDIT:
нашел EM_GETLINECOUNT, который, как я думал, был ответом, за исключением док говорит:сообщение EM_GETLINECOUNT извлекает общее количество строк текста, а не только количество строк, которые в настоящее время видны.
мучительно, есть также EM_GETFIRSTVISIBLELINE, который получает первую видимую строку, но я не смог найти GETLASTVISIBLEINE. ??
2 ответов
Ну, это не красиво, но это работает для меня. В основном я проверяю точку внутри верхнего левого угла richtextbox и точку внутри нижнего левого угла textbox. Возможно, вам придется настроить координаты точек в зависимости от того, как отображается 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
Я тестировал его для richtextboxes с несколькими размерами шрифтов отображается, и это, кажется, работает. Я подозреваю, что ответ, который возвращается, будет выключен (слишком мал) одной строкой, если последняя строка отображаемого текста имеет много пробелов под ней, а следующая строка почти готова к отображению. Если у вас очень высокий richtextbox, со многими линиями, это не должно быть проблемой.
чтобы отобразить количество строк, которое может отображать 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 " в текущем шрифте, чтобы найти высоту строки в пикселях.