Adattare la dimensione di un Oggetto grafico al testo contenuto
La presente pagina considera i Controlli grafici (widget) che posseggono la Proprietà ".Text" o similare, alla quale assegnare una stringa di testo, ma non sono costituiti da un'area di testo. [nota 1]
Per adattare la dimensione di un Oggetto grafico al testo in esso contenuto, si possono adottare le seguenti modalità.
Indice
Uso dei Metodi ".TextWidth()" e ".TextHeight()"
I Metodi ".TextWidth()" e ".TextHeight()" della Proprietà ".Font" del Controllo impostano la dimensione di questo in base alla misura dei caratteri usati.
Mostriamo di seguito un semplice esempio, nel quale si creerà una Label sul Form, adattandone con i Metodi in questione la dimensione alla quantità e all'altezza dei caratteri assegnati alla sua Proprietà ".Text":
Private Label1 As Label Public Sub Form_Open() With Label1 = New Label(Me) As "Label1" .Text = "Label pQqJj/|]" .W = .Font.TextWidth(.Text) .H = .Font.TextHeight(.Text) .X = 50 .Y = 50 .Background = Color.Yellow End With End
Se al precedente esempio aggiungiamo la seguente routine, cliccando sulla Label vedremo la dimensione del Controllo adattarsi all'aumentare della misura del font.
Public Sub Label1_MouseUp() For b As Byte = 7 To 30 With Label1 .Font.Size = b .W = .Font.TextWidth(.Text) .H = .Font.TextHeight(.Text) End With Wait 0.5 Next End
Evitare che il testo non sia sufficientemente distante dai bordi del Controllo
Per evitare che il testo non sia sufficientemente distante dai bordi del Controllo e quindi non sia ben visibile, si potrà sommare alla dimensione orizzontale (lunghezza) o verticale (altezza) del Controllo il valore ritornato da "Desktop.Scale".
Esempio:
Label1.W = Label1.Font.TextWidth(Label1.Text) + Desktop.Scale
Uso del Metodo ".TextSize()"
Questa modalità prende in considerazione il Metodo ".TextSize()" della Proprietà ".Font" del Controllo:
Private Label1 As Label Public Sub Form_Open() With Label1 = New Label(Me) As "Label1" .Text = "Label pQqJj/|]\nLabel pQqJj/|]\nLabel pQqJj/|]" .W = .Font.TextSize(.Text).W .H = .Font.TextSize(.Text).H .X = (Me.W / 2) - (Label1.W / 2) .Y = (Me.H / 2) - (Label1.H / 2) .Background = Color.Yellow End With End Public Sub Label1_MouseUp() For b As Byte = 7 To 30 With Label1 .Font.Size = b .W = .Font.TextSize(.Text).W .H = .Font.TextSize(.Text).H End With Wait 0.5 Next End
Uso della Classe Rect
Per adattare la dimensione del controllo grafico al testo contenuto, è possibile fare uso della Classe Rect, per individuare l'area occupata dal testo contenuto dal Controllo.
Mostriamo un esempio, nel quale si considereranno la lunghezza e l'altezza del Controllo. In particolare cliccando sul Button, la dimensione complessiva di questo Controllo si adatterà al previsto cambiamento della dimensione del font.
Private Const TESTO As String = "Il testo di Button\nSu\nTre righe" Public Sub Form_Open() Dim bt As Button Dim rc As Rect With Me .W = 500 .H = 500 End With With bt = New Button(Me) As "Tasto" .X = 10 .Y = 200 rc = .Font.TextSize(TESTO) .W = rc.W + Desktop.Scale .H = rc.H + Desktop.Scale .Text = TESTO End With End Public Sub Tasto_Click() Dim rc As Rect With Last ' Incrementa la dimensione del "font": .Font.Size = 24 .Font.Bold = True rc = .Font.TextSize(TESTO) .W = rc.W + Desktop.Scale .H = rc.H + Desktop.Scale .Text = TESTO End With End
Adattamento automatico mediante l'uso della Proprietà ".AutoResize"
L'uso della Proprietà ".AutoResize" dell'Oggetto di testo consente l'adattamento automatico del Controllo alle dimensione del font del testo contenuto, senza l'uso di ulteriori risorse del Controllo medesimo. A essa va assegnato il valore booleano "True".
Mostriamo un esempio essenziale:
Private Label1 As Label Public Sub Form_Open() With Label1 = New Label(Me) As "Label1" .Text = "Label pQqJj/|]\nLabel pQqJj/|]\nLabel pQqJj/|]" .X = 50 .Y = 50 .Background = Color.Yellow .AutoResize = True End With End Public Sub Label1_MouseUp() For b As Byte = 7 To 30 With Label1 .Font.Size = b .Resize(Desktop.Scale, Desktop.Scale) End With Wait 0.5 Next End
In quest'altro esempio [nota 2] avverrà un adattamento automatico del Controllo al modificarsi della dimensione del font:
Public Sub Form_Open() Dim hButton As Button With Me .W = 500 .H = 500 End With With hButton = New Button(Me) As "Button" .X = 10 .Y = 100 .W = 10 .H = 10 .AutoResize = True .Text = "Il testo del Button1" End With With hButton = New Button(Me) As "Button" .X = 10 .Y = 200 .W = 10 .H = 10 .AutoResize = True .Text = "Il testo di Button2\nSu\nTre righe" End With End Public Sub Button_Click() Dim i As Integer Last.Font.Size = 24 Last.Font.Bold = True i = ControlHeight(Last.Text, Last.Font) If i > 0 Then Last.H = i End Private Function ControlHeight(sText As String, hFont As Font) As Integer Dim i As Integer Dim DS As Integer = Desktop.Scale ' Ottengo le righe meno 1: If String.InStr(sText, "\n") > 0 Then i = Split(sText, "\n").Max Else If String.InStr(sText, "<br>") > 0 Then i = Split(sText, "<br>").Max Else Return 0 Endif Return ((i + 1) * hFont.Height) + (DS * 2) End
Note
[1] Vedere anche questa pagina: Adattare la dimensione del font in un Oggetto grafico o di testo se il testo occupa una lunghezza o un'altezza superiore a quella dell'Oggetto
[2] Questo codice è stato proposto dal membro Gianluigi del forum www.gambas-it.org.