In questo articolo vedremo come tramite il linguaggio di programmazione Visual Basic Net e C# a run time un font personalizzato non presente nella lista dei caratteri.
Spesso può capitare che dobbiamo impostare nelle nostre Windows Application, un font particolare ai vari controlli, in questo articolo vedremo come personalizzare controlli di tipo label.
Prima i tutto bisogna avere un font personalizzato, nel caso che non si ha uno a portato di mano, dal seguente sito http://www.1001fonts.com/open-sans-font.html si può scaricarne uno gratuitamente.
Stesura codice
Si crea un nuovo progetto di tipo Windows Application, tramite il linguaggio di proprio gradimento.
Nella finestra o meglio nella form, inseriamo 4 label. In un controllo impostiamo il font di tipo “TeamViewer11” a carattere 16 di grandezza ed in formato grassetto.
A questo punto entriamo nella proprietà del progetto, tramite la finestra “Esplora Soluzione” facciamo click sul tasto destro sul nome del progetto, ed alla voce “Proprietà” facciamo click con il pulsante sinistro.
Nella finestra delle proprietà, selezionare la voce “Risorse” e nei menu posti nella parte superiore, fare click sul pulsante “Aggiungi risorsa” e nel sottomenu selezionare la voce “Aggiungi file esistente…” il tutto come mostrato in figura 1.
Figura 1 – La finestra delle proprietà
In questo modo abbiamo aggiunto al progetto una risorsa.
Facciamo click sulla nostra form (che può chiamarsi form1) e facciamo doppio click su un qualunque punto della form, in modo che si passa in visualizzazione codice nell’evento load.
Inseriamo lo spazio dei nomi per gestire le varie classi, in alto sopra ad ogni dichiarazione, scriviamo i namespace per gestire il testo, e la interoperabilità.
Qui di seguito tale dichiarazioni.
VB.Net
Imports System.Drawing.Text
Imports System.Runtime.InteropServices
C#
using System.Runtime.InteropServices;
using System.Text;
Ora ritorniamo nell’evento load della nostra form, è scriviamo il codice per modificare a runtime il font di tutti i controlli label che sono presenti nella form con il font aggiunto come risorsa.
Il codice, eseguirà un ciclo in tutti i controlli della form, e nel caso che il controllo è di tipo label, dalla risorsa aggiunta (font) ottiene un binario per generare un oggetto di tipo “Privatefontcollection” per creare poi un oggetto di tipo font.
Qui di seguito il codice per impostare in ogni label il font aggiunto come risorsa.
VB.Net
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For Each elemento In Me.Controls
If (TypeOf elemento Is Label) Then
Dim MiaLabel As Label = CType(elemento, Label)
Dim pFontCollection As PrivateFontCollection = New PrivateFontCollection
'Il totale dei byte
Dim fontLength As Integer = My.Resources.OpenSans_Bold.Length
'Buffer
Dim fontBufferData() As Byte = My.Resources.OpenSans_Bold
'Alloco la memoria
Dim datiMemoria As System.IntPtr = Marshal.AllocCoTaskMem(fontLength)
'Copio i dati nel blocco di memoria
Marshal.Copy(fontBufferData, 0, datiMemoria, fontLength)
'aggiungo alla collezione
pFontCollection.AddMemoryFont(datiMemoria, fontLength)
'Imposto il font
MiaLabel.Font = New Font(pFontCollection.Families(0), Label1.Font.Size)
End If
Next
End Sub
C#
private void Form1_Load(object sender, EventArgs e)
{
foreach (var elemento in this.Controls)
{
if (elemento is Label)
{
Label MiaLabel = (Label)elemento;
PrivateFontCollection pFontCollection = new PrivateFontCollection();
//Il totale dei byte
int fontLength = Properties.Resources.OpenSans_Bold.Length;
//Buffer
byte[] fontBufferData = Properties.Resources.OpenSans_Bold;
//Alloco la memoria
System.IntPtr datiMemoria = Marshal.AllocCoTaskMem(fontLength);
//Copio i dati nel blocco di memoria
Marshal.Copy(fontBufferData, 0, datiMemoria, fontLength);
//aggiungo alla collezione
pFontCollection.AddMemoryFont(datiMemoria, fontLength);
//Imposto il font
MiaLabel.Font = new Font(pFontCollection.Families[0], label1.Font.Size);
}
}
}
A questo punto non dobbiamo altro che eseguire la nostra applicazione, tramite “F5” o “Esegui” vedremo che la form ha tutti i controlli impostati con il font da noi indicato. Anche quello che avevamo in precedenza impostato un determinato font.
Conclusioni
L’articolo ha voluto fornire al lettore una tecnica di come impostare a runtime il font dei controlli, in questo caso di tipo “Label” in ambito Windows Forms.
Al momento non è possibile impostare a design time, ossia in modalità grafica, il tipo di font di un carattere personalizzato.