2010-05-28 8 views
7

Wie Ressourcen Schriftart direkt zu verwenden, ohne Schrift in lokalen Dateisystem für eigenständige Anwendung [Desktop-Anwendung] in VB.net/C# speichern?Verwenden Sie Ressource Schriftart direkt in VB.net/C#

+0

@SamSol: CS.NET gibt es nicht. Wo hast du jemals davon gehört? Die Sprache ist nur "C#". –

Antwort

14

Das ist möglich, müssen Sie die PrivateFontCollection.AddMemoryFont() -Methode verwenden. Zum Beispiel habe ich eine Schriftdatei mit dem Namen „test.ttf“ als Ressource und verwendet es wie folgt aus:

using System.Drawing.Text; 
using System.Runtime.InteropServices; 
... 
public partial class Form1 : Form { 
    private static PrivateFontCollection myFonts; 
    private static IntPtr fontBuffer; 

    public Form1() { 
     InitializeComponent(); 
     if (myFonts == null) { 
      myFonts = new PrivateFontCollection(); 
      byte[] font = Properties.Resources.test; 
      fontBuffer = Marshal.AllocCoTaskMem(font.Length); 
      Marshal.Copy(font, 0, fontBuffer, font.Length); 
      myFonts.AddMemoryFont(fontBuffer, font.Length); 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) { 
     FontFamily fam = myFonts.Families[0]; 
     using (Font fnt = new Font(fam, 16)) { 
      TextRenderer.DrawText(e.Graphics, "Private font", fnt, Point.Empty, Color.Black); 
      //e.Graphics.DrawString("Private font", fnt, Brushes.Black, 0, 0); 
     } 
    } 
} 

Sie beachten, dass die fontBuffer Variable statische absichtlich. Die Speicherverwaltung ist schwierig, wenn Sie AddMemoryFont() verwenden. Der Speicher muss so lange gültig sein, wie die Schriftart verwendet werden kann und die PrivateFontCollection noch nicht entfernt wurde. Achten Sie darauf, Marshal.FreeCoTaskMem() nicht aufzurufen, wenn Sie diese Garantie nicht haben, ist es ein sehr häufiger Fehler, der sehr schwer zu diagnostizieren Textbeschädigung verursacht. Sie erhalten nur eine AccessViolationException, wenn Sie Glück haben. Für die Lebensdauer des Programms gültig zu halten, ist die einfache Lösung.

+0

Hervorragend. Danke fürs Schreiben. – Harsha

+1

@HansPassant: Was ist, wenn die Font-Datei, die ich hinzufügen möchte, die Erweiterung '.bin' anstelle von '.ttf' hat –

+1

Ich musste PInvoke verwenden, bevor die Dinge funktionierten. Die Funktion ['AddFontMemResourceEx'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd183325 (v = vs.85) .aspx) musste verwendet werden ... vielleicht weil' PrivateFontCollection .AddMemoryFont() 'erwartet, dass sich die Schriftart im Systemspeicher befindet. Ich frage mich auch, ob dies etwas mit der Tatsache zu tun hat, dass ich die Schriftart einer Textbox änderte, anstatt explizit mit der Schriftart zu rendern. (Die Verwendung von 'PrivateFontCollection.AddFontFile()' funktionierte jedoch immer noch ohne die PInvoke-Funktion). –

Verwandte Themen