2009-02-13 5 views

Antwort

11

Dieser Artikel: How to embed a true type font zeigt, wie Sie tun, was Sie in .NET fragen.

Wie eine True Type Schriftart aus Gründen der Ästhetik oder einer erforderlichen Sicht Stil, bettet bestimmte ungewöhnliche Schriftarten, so dass sie immer da bei Bedarf unabhängig von

Einige Anwendungen einzubetten, ob Die Schriftart ist tatsächlich auf dem Zielsystem installiert.

Das Geheimnis dazu ist zweifach. Zuerst muss die Schriftart in die Ressourcen platziert werden, indem Sie sie zur Lösung hinzufügen und als eingebettete Ressource markieren. Zweitens wird die Schriftart zur Laufzeit über einen Stream geladen und für die spätere Verwendung in einem PrivateFontCollection-Objekt gespeichert.

In diesem Beispiel wird eine Schriftart verwendet, die wahrscheinlich nicht auf Ihrem System installiert ist. Alpha Dance ist eine kostenlose True Type-Schriftart, die von der Free Fonts Collection erhältlich ist. Diese Schriftart wurde in die Anwendung eingebettet, indem sie zur Lösung hinzugefügt wurde und die Build-Aktion "embedded resource" in den Eigenschaften ausgewählt wurde.

Figure 1. The Alpha Dance font file embedded in the solution.

Sobald die Datei in den Ressourcen erfolgreich aufgenommen wurde benötigen Sie ein Privates Objekt zu schaffen, in dem sie speichern und eine Methode, mit der sie in die Sammlung geladen werden. Der beste Ort zu tun Dies ist wahrscheinlich die Form Load Override oder Event-Handler. Die folgende Liste zeigt den Prozess: . Beachten Sie, wie die AddMemoryFont-Methode verwandt wird. Es erfordert einen Zeiger auf den Speicher, in dem die Schriftart als ein Array von Bytes gespeichert ist. In C# können wir das unsichere Schlüsselwort für convienience verwenden, aber VB muss die Fähigkeiten der Marshall-Klassen unmanaged Speicherbehandlung verwenden. Die letztere Option ist natürlich offen für C# Programmierer, die das unsafe Schlüsselwort einfach nicht mögen. PrivateFontCollection pfc = neue PrivateFontCollection();

private void Form1_Load(object sender, System.EventArgs e) 
{ 
    Stream fontStream = this.GetType().Assembly.GetManifestResourceStream("embedfont.Alphd___.ttf"); 

    byte[] fontdata = new byte[fontStream.Length]; 
    fontStream.Read(fontdata,0,(int)fontStream.Length); 
    fontStream.Close(); 
    unsafe 
    { 
    fixed(byte * pFontData = fontdata) 
    { 
     pfc.AddMemoryFont((System.IntPtr)pFontData,fontdata.Length); 
    } 
    } 
} 

Fonts können nur bestimmte Arten haben, die leider verfügbar und sind, eine Schriftart auswählen, die nicht wird nicht existiert eine Ausnahme auslösen.Um dies zu umgehen, kann die Schriftart abgefragt werden, um zu sehen, welche Stile verfügbar sind und nur die von der Schriftart bereitgestellten verwendet werden können. Die folgende Liste zeigt, wie die Schriftart Alpha Dance von verwendet wird, um die verfügbaren Schriftarten zu überprüfen und alle vorhandenen zu zeigen. Beachten Sie, dass die Unterstreichungs- und Durchstreichungsstile Pseudo-Styles sind, die von der Schriftart-Rendering-Engine erstellt wurden und in Glyphform nicht tatsächlich bereitgestellt werden.

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) 
{ 
    bool bold=false; 
    bool regular=false; 
    bool italic=false; 

    e.Graphics.PageUnit=GraphicsUnit.Point; 
    SolidBrush b = new SolidBrush(Color.Black); 

    float y=5; 

    System.Drawing.Font fn; 

    foreach(FontFamily ff in pfc.Families) 
    { 
    if(ff.IsStyleAvailable(FontStyle.Regular)) 
    { 
     regular=true; 
     fn=new Font(ff,18,FontStyle.Regular); 
     e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
     fn.Dispose(); 
     y+=20; 
    } 
    if(ff.IsStyleAvailable(FontStyle.Bold)) 
    { 
     bold=true; 
     fn=new Font(ff,18,FontStyle.Bold); 
     e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
     fn.Dispose(); 
     y+=20; 
    } 
    if(ff.IsStyleAvailable(FontStyle.Italic)) 
    { 
     italic=true; 
     fn=new Font(ff,18,FontStyle.Italic); 
     e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
     fn.Dispose(); 
     y+=20; 
    } 
    if(bold && italic) 
    { 
     fn=new Font(ff,18,FontStyle.Bold | FontStyle.Italic); 
     e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
     fn.Dispose(); 
     y+=20; 
    } 
    fn=new Font(ff,18,FontStyle.Underline); 
    e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
    fn.Dispose(); 
    y+=20; 
    fn=new Font(ff,18,FontStyle.Strikeout); 
    e.Graphics.DrawString(fn.Name,fn,b,5,y,StringFormat.GenericTypographic); 
    fn.Dispose(); 
    } 

    b.Dispose(); 
} 

Abbildung 2 zeigt die Anwendung in Aktion.

Figure 2. The embedded Alpha Dance font.

den Handler Form1_Paint Ereignis sehen, es zeigt insbesondere, wie die System.Drawing.Font Typ einzustellen. Es basiert auf der Verwendung der System.Drawing.Text.PrivateFontCollection-Klasse.

Hoffe, das hilft.

+6

Bitte bearbeiten Sie Ihre Antwort. Die Verbindung ist tot. – Odys

3

Verwenden Sie die API-Funktion AddFontResourceEx über p/invoke und übergeben Sie FR_PRIVATE, um die Installation einer globalen Schriftart zu verhindern. Dann sollten Sie wie gewohnt den Fontnamen an den Font-Konstruktor übergeben können.

Edit: Wenn Sie die PrivateFontCollection verwenden und die Schriftart aus einer externen Datei laden, brauchen Sie nicht einmal dies. Wenn Sie die Schriftart von einer eingebetteten Ressource laden, verwenden Sie die Lösung von Ash.

+1

Gibt es ein Beispiel wo? Ich kann den MSDN-Link wirklich verstehen. Danke für deine Hilfe. – kthakore

Verwandte Themen