2009-11-20 21 views
10

Ho un'app Winforms contenente un RichTextBox.Winforms RichTextBox: come posso determinare quante righe di testo sono visibili?

Come determinare quante righe di testo sono visualizzate, attualmente visibili?

Motivo: voglio scorrere il punto di inserimento al centro del RichTextBox. Posso usare RichTextBox.ScrollToCaret(), ma questo pone il punto di inserimento nella parte superiore del RichTextBox. Immagino, se so quante righe sono visualizzate, potrei spostare il cursore "indietro" di n/2 linee, quindi chiamare ScrollToCaret(), quindi ripristinare la posizione originale del cursore.

EDIT:

ho trovato EM_GETLINECOUNT, che ho pensato è stata la risposta, ad eccezione del dottore dice: Il messaggio EM_GETLINECOUNT recupera il numero totale di righe di testo, non solo il numero di linee che sono attualmente visibili .

Tantalizingly, c'è anche EM_GETFIRSTVISIBLELINE, che ottiene la prima linea visibile, ma non ho trovato un GETLASTVISIBLELINE. ??


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

+0

Appena interessato - cosa hai intenzione di fare con queste informazioni? Ti rendi conto che questo potrebbe essere variabile, perché puoi avere caratteri diversi e riempire tutto il testo. –

+0

È iniziato a creare una RTB personalizzata che visualizza i numeri di riga: http://stackoverflow.com/questions/2567263/how-to-show-number-of-a-line-in-a-richtextbox-c/2668264#2668264 – Cheeso

risposta

16

Beh, questo non è abbastanza, ma funziona per me. Fondamentalmente sto controllando un punto appena dentro l'angolo in alto a sinistra della casella di testo e un punto appena dentro l'angolo in basso a sinistra della casella di testo. Potrebbe essere necessario regolare le coordinate del punto a seconda di come viene visualizzato il richtextbox. Quindi ottengo l'indice dei caratteri più vicino a ciascuno di questi due punti e recupera la linea su cui si trova.

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 

L'ho provato per i richtextbox con più dimensioni di caratteri visualizzati e sembra funzionare. Sospetto che la risposta restituita sia disattivata (troppo piccola) da una riga se l'ultima riga del testo visualizzato ha molto spazio bianco al di sotto e la riga successiva è quasi pronta per essere visualizzata. Se hai un richtextbox molto alto, con molte linee, questo non dovrebbe essere un problema.

+1

ha funzionato perfettamente. Grazie. – Cheeso

+0

Brillante. Grazie mille. – Larry

0

Per visualizzare il numero di righe che un RichTextBox è in grado di visualizzare, anche se non c'è nessun testo c'è attualmente, provare:

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 

Questo utilizza l'altezza di una lettera di prova 'A' nella corrente carattere per trovare l'altezza della linea in pixel.

Problemi correlati