Come posso calcolare il numero di righe in una casella di testo?
-
09-09-2019 - |
Domanda
Spero che qualcuno mi può aiutare con un problema che ho al momento con Compact Framework.Net 2 SP 2.
Al momento ho una UI con una serie di caselle di testo e ogni casella di testo visualizza il contenuto di un campo del database.Questi vengono visualizzati uno sotto l'altro con una barra di scorrimento sul lato destro del modulo.Ogni casella di testo ha un set di larghezza, che potrebbe
Vorrei regolare l'altezza di ogni casella di testo in base al numero di linee si è in possesso, la dimensione del carattere e il font per evitare di utilizzare le barre di scorrimento su ogni casella di testo.
Al momento sono stati in grado di fare questo in un'applicazione di prova.
Screenshot:
vedi la figura in uscita http://morrislgn.brinkster.net/SO/screenshot.jpg
Il mio codice:
'Text used in this example:
'TextBox1qwertyuiop lkjhgfdsazxcvbnm1234567890 TextBo
'x1qwer tyuioplkjhgfdsazxcvb nm1234567890
'qwe
'End of exmaple text.
Me.Textbox2.Text = Me.Textbox1.Text
Dim pobjGraphic As Graphics = Me.Textbox2.Parent.CreateGraphics()
Dim pobjSize As SizeF
'Padding values:
Dim piTop As Int32 = 4 'top of text and top of textbox
Dim piBottom As Int32 = 3 'bottom of text and top of textbox
Dim piLines As Int32 = 0
'Based on the font size chosen by the user, create a font to perform the calculation with.
Dim piFontSize As Single = 10
If Me.CheckBox1.Checked.Equals(True) Then
piFontSize = 6
ElseIf Me.CheckBox2.Checked.Equals(True) Then
piFontSize = 8
ElseIf Me.CheckBox3.Checked.Equals(True) Then
piFontSize = 12
Else
piFontSize = 10
End If
Dim pobjFont As New Font("Tahoma", piFontSize, FontStyle.Regular)
'Calculate the height of one line.
pobjSize = pobjGraphic.MeasureString("HELLO WORLD", pobjFont)
'Value of pobjSize returned: {Width = 71.0 Height = 13.0}
'Calculate the number of lines
Dim b As Bitmap
b = New Bitmap(1, 1, Imaging.PixelFormat.Format32bppRgb)
'Calculate the number of lines required to display the text properly based on the lenght of the text the width of the control.
'Length of text to show divide by the width of the textbox
piLines = Graphics.FromImage(b).MeasureString(Me.Textbox2.Text, pobjFont).Width / Me.Textbox2.Width
'Value of piLines returned: 2
If piLines = 0 Then
piLines = 1
End If
'Calculate the size of the text to be displayed using the margins, height of one line and number of lines.
Me.Textbox2.Height = (pobjSize.Height * piLines) + piTop + piBottom
' value produced: 33 = (13 * 2) + 4 + 3
'set font of text box
Me.Textbox2.Font = pobjFont
Infine, so che questo può essere raggiunto tramite una chiamata di COREDLL.dll utilizzo di p/invoke, ma facendo questo rende il crash dell'applicazione.
Ciao Gente,
Qui di seguito è la pinvoke codice come richiesto:
<Runtime.InteropServices.DllImport("coredll.dll")> _
Private Function SendMessage( _
ByVal hwnd As IntPtr, ByVal msg As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer) As Integer
End Function
<Runtime.InteropServices.DllImport("coredll.dll")> _
Private Function GetCapture() As IntPtr
End Function
<Runtime.InteropServices.DllImport("coredll.dll")> _
Private Function ReleaseCapture() As Boolean
End Function
Public Function GetNumberOfLines(ByVal ptxtCountBox As TextBox) As Integer
Try
Dim hnd As IntPtr = New IntPtr
ptxtCountBox.Capture = True
' Capture the textbox handle.
hnd = GetCapture()
ptxtCountBox.Capture = False
' Get the count of the lines in the box.
Dim plCount As Integer = SendMessage(ptxtCountBox.Handle, EM_GETLINECOUNT, 0, 0)
' Count the number of return lines as we minus this from the total lines to take.
plCount = plCount - (CharCount(ptxtCountBox.Text, vbCrLf, False))
plCount += RemoveNonASCIIReturns(ptxtCountBox)
ReleaseCapture()
hnd = Nothing
' Return the line count.
Return plCount
Catch ex As Exception
GenerateError(msCLASS_NAME, "GetNumberOfLines", ex.Message.ToString)
End Try
End Function
Grazie,
Morris
Soluzione
Ho chiesto a una domanda simile e ha ottenuto una risposta che ha completamente soddisfatto le mie esigenze in materia!!!Si prega di controllare stevo3000 la risposta alla mia domanda:AutoSize per Etichetta / casella di testo in .NET Compact Framework
Ha fatto riferimento a questi due post che è completamente risolto il mio problema con uno swipe!http://www.mobilepractices.com/2007/12/multi-line-graphicsmeasurestring.html http://www.mobilepractices.com/2008/01/making-multiline-measurestring-work.html
Altri suggerimenti
che ho avuto fino in fondo questo:
Public Function GetNumberOfLines(ByVal pstext As String, ByVal pobjfont As Font, ByVal pobjDimensions As Size) As Decimal
Dim pslines As String() = Nothing
'Used to measure the string to be placed into the textbox
Dim pobjBitMap As Bitmap = Nothing
Dim pobjSize As SizeF = Nothing
Try
Dim psline As String = String.Empty
Dim pilinecount As Decimal = 0.0
'Spilt the text based on the number of lines breaks.
pslines = pstext.Split(vbCrLf)
For Each psline In pslines
'Create a graphics image which is used to work out the width of the text.
pobjBitMap = New Bitmap(1, 1, Imaging.PixelFormat.Format32bppRgb)
pobjSize = Graphics.FromImage(pobjBitMap).MeasureString(psline, pobjfont)
'If the width of the text is less than 1.0 then add one to the count. This would incidcate a line break.
If pobjSize.Width < 1.0 Then
pilinecount = pilinecount + 1
Else
'Based on the dimensions of the text, work out the number of lines. 0.5 is added to round the value to next whole number.
pilinecount = pilinecount + (Round((pobjSize.Width / pobjDimensions.Width) + 0.5))
End If
Next
'If the line count it less than 1 return one line.
If pilinecount < 1.0 Then
Return 1.0
Else
Return pilinecount
End If
Catch ex As Exception
Return 1.0
Finally
If pslines IsNot Nothing Then
Array.Clear(pslines, 0, pslines.Length - 1)
pslines = Nothing
End If
If pobjBitMap IsNot Nothing Then
pobjBitMap.Dispose()
End If
End Try
End Function
Certo, è un po 'di hack, ma sembra funzionare bene in questo momento! Eventuali osservazioni o commenti su come migliorare questo sono più che benvenuti.
Inoltre, circa l'/ invocare roba p, scoperto la radice del problema, o meglio la soluzione. Aggiornato il fx .Net sul mio dispositivo e che sembra aver risolto il problema.
Grazie
Morris
Bene, vorrei suggerire una soluzione intelligente del suono e per voi. Ecco l'algoritmo:
- Utilizzare un controllo Label per riferimento.
-
Assegna: • La dimensione della casella di testo per l'etichetta. • Il carattere della casella di testo per l'etichetta. • Autosize-proprietà di etichetta da True . • BorderStyle proprietà del Label come di Casella di testo'. • MinimumSize proprietà di Label come formato originale della casella di testo. • MaximumSize proprietà di Label come Larghezza-come l'originale e l'altezza per essere un grande multipla l'altezza originale.
-
Assegnare la Casella di testo' Testo al testo di etichetta.
- Ora: se la PrefferdHeight-proprietà di Label> Altezza della casella di testo == true È il momento di aumentare l'altezza della casella di testo e verificare la condizione di cui sopra fino a quando è falsa.
- L'etichetta può essere smaltito ora.
Ho anche inviato una soluzione simile in Forum MSDN che può anche essere controllato: [ http : //social.msdn.microsoft.com/Forums/en-US/winforms/thread/03fc8e75-fc13-417a-ad8c-d2b26a3a4dda] [1]
Saluti. :)