2009-11-20 28 views
10

Tôi có ứng dụng Winforms chứa RichTextBox.RichformBox Winforms: Làm thế nào tôi có thể xác định có bao nhiêu dòng văn bản được hiển thị?

Tôi làm cách nào để xác định số lượng dòng văn bản được hiển thị, hiện hiển thị?

Lý do: Tôi muốn cuộn dấu mũ vào giữa RichTextBox. Tôi có thể sử dụng RichTextBox.ScrollToCaret(), nhưng điều đó đặt dấu mũ ở đầu RichTextBox. Tôi hình, Nếu tôi biết có bao nhiêu dòng được hiển thị, tôi có thể di chuyển dấu "trở lại" n/2 dòng, sau đó gọi ScrollToCaret(), sau đó khôi phục vị trí dấu nháy ban đầu.

EDIT:

tôi thấy EM_GETLINECOUNT, mà tôi nghĩ là câu trả lời, ngoại trừ doc nói: Thông điệp EM_GETLINECOUNT lấy tổng số dòng văn bản, không chỉ số dòng hiện đang hiển thị .

Ngạc nhiên, cũng có EM_GETFIRSTVISIBLELINE, dòng này có dòng hiển thị đầu tiên, nhưng tôi không thể tìm thấy GETLASTVISIBLELINE. ??


liên quan:
How can I scroll the caret to the middle of the RichTextBox?

+0

Chỉ cần quan tâm - bạn sẽ làm gì với thông tin này? Bạn nhận ra rằng điều này có thể thay đổi, bởi vì bạn có thể có phông chữ và đệm khác nhau trong suốt văn bản. –

+0

Nó đã được xây dựng một RTB tùy chỉnh hiển thị số dòng: http://stackoverflow.com/questions/2567263/how-to-show-number-of-a-line-in-a-richtextbox-c/2668264#2668264 – Cheeso

Trả lời

16

Vâng, đây không phải là đẹp, nhưng nó làm việc cho tôi. Về cơ bản tôi đang kiểm tra một điểm ngay bên trong góc trên bên trái của richtextbox và một điểm ngay bên trong góc dưới bên trái của hộp văn bản. Bạn có thể phải điều chỉnh tọa độ điểm tùy thuộc vào cách richtextbox của bạn được hiển thị. Sau đó, tôi nhận được chỉ số ký tự gần nhất với hai điểm đó và truy xuất dòng mà nó đang bật.

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 

Tôi đã thử nghiệm nó cho richtextbox với nhiều kích thước phông chữ được hiển thị và có vẻ như nó hoạt động. Tôi nghi ngờ rằng câu trả lời được trả về sẽ bị tắt (quá nhỏ) bởi một dòng nếu dòng cuối cùng của văn bản được hiển thị có nhiều khoảng trắng bên dưới và dòng tiếp theo gần như đã sẵn sàng để hiển thị. Nếu bạn có một richtextbox rất cao, với nhiều dòng, đây không phải là một vấn đề.

+1

hoạt động hoàn hảo. cảm ơn. – Cheeso

+0

Rực rỡ. Cảm ơn nhiều. – Larry

0

Để hiển thị số dòng mà một RichTextBox là khả năng hiển thị, ngay cả khi không có văn bản hiện nay, hãy thử:

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 

này sử dụng chiều cao của thư test 'A' trong hiện tại phông chữ để tìm chiều cao dòng theo pixel.

Các vấn đề liên quan