martedì 19 giugno 2018

.Net impostare un font personalizzato ai controlli label in Windows in VB.Net e C#

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/programmazione/art_net-impostare-un-font-personalizzato-ai-_1571.aspx

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.

Nessun commento: