Sto sviluppando una applicazione che utilizzerà dei caratteri (fonts) particolari; è possibile evitare di installare tali caratteri nel PC dell’utente includendoli all’interno dell’applicazione e caricandoli in memoria a runtime: questo tutorial spiega come fare…
Font
Inseriamo il file del font all’interno della cartella del progetto:
Nell’esempio ho scelto il font Always Forever di Brittney Murphy.
Aggiungiamo il file al nostro progetto selezionando Add – Existing Item… e selezionando il nostro font:
Configuriamo come Build Action Embedded Resource:
Codice
Per prima cosa configuriamo il progetto abilitando il codice unsafe:
Creiamo una istanza dell’oggetto PrivateFontCollection che conterrà il font una volta caricato in memoria:
private PrivateFontCollection pfc = new PrivateFontCollection(); |
Leggiamo il contenuto del file e memorizziamolo nel byte array fontdata:
Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("EmbeddingFontDemo.always_forever.ttf"); byte[] fontdata = new byte[fontStream.Length]; fontStream.Read(fontdata, 0, (int)fontStream.Length); fontStream.Close(); |
Infine aggiungiamo il font all’oggetto PrivateFontCollection; dovendo usare i puntatori dobbiamo includere la chiamata in un blocco unsafe:
unsafe { fixed (byte* pFontData = fontdata) { pfc.AddMemoryFont((System.IntPtr)pFontData, fontdata.Length); } } |
Per poter utilizzare il font all’interno di un controllo, è necessario impostare a true la proprietà del controllo UseCompatibleTextRendering:
E’ ora possibile applicare il nuovo font al controllo:
label1.Font = new Font(pfc.Families[0], 30, FontStyle.Regular); |
Demo
Ho preparato un progetto che dimostra quando spiegato sopra, disponibile nel mio repository GitHub.