Wie verwende ich eine benutzerdefinierte .tff-Schriftart-Datei, die ich mit meiner aktuellen windows.forms-Anwendung habe? Ich habe gelesen, wo ich es als eine eingebettete Ressource verwenden, aber wie kann ich es den System.Drawing.Font-Typ festlegen?Benutzerdefinierte .ttf-Schriftarten zur Verwendung in C# windows.Form
Antwort
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.
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.
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.
Bitte bearbeiten Sie Ihre Antwort. Die Verbindung ist tot. – Odys
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.
Gibt es ein Beispiel wo? Ich kann den MSDN-Link wirklich verstehen. Danke für deine Hilfe. – kthakore
Sie könnten einen MSDN Artikel How to: Create a Private Font Collection nützlich finden.
- 1. windows.form C# zwischen Formen wechseln
- 2. C# WebBrowser Kontrollseite zurück zu Windows.Form Funktion
- 3. vb.net generali Faden sicher Windows.Form
- 4. Windows.Form nicht Feuer keyDown Ereignis
- 5. C Statische Bibliothek (.lib) zur Verwendung in einer C DLL
- 6. Objective-c-Methode zur Verwendung von Blöcken
- 7. C#: Klasse zur Verwendung mit Objekt
- 8. C#, Lokad.Shared: Wie schreibe ich benutzerdefinierte Regeln zur Verwendung mit Enforce
- 9. Schreiben eines C-Makros zur Verwendung in einem CUDA-Kernel
- 10. Frage zur Verwendung von libmemcached
- 11. Benutzerdefinierte Verwendung von Indexern []
- 12. Benutzerdefinierte Ereignisse in C++?
- 13. Benutzerdefinierte Zeichencodierung in C
- 14. Benutzerdefinierte Primitive in C#?
- 15. Benutzerdefinierte Dateierweiterung in C++
- 16. Benutzerdefinierte Ausnahmen in C++
- 17. C++/CLI-Wrapper für natives C++ zur Verwendung als Referenz in C#
- 18. Variable zur Verwendung [Datenbank]
- 19. Benutzerdefinierte Funktion zur automatischen Vervollständigung in jquery
- 20. Benutzerdefinierte list.sort Vergleiche in C++
- 21. Benutzerdefinierte Serversteuerelemente - Basisklassen und Verwendung
- 22. Verwendung von C# var zur Typisierung von impliziter System.Data.DataRow
- 23. C++ CLI Korrekter Weg zur Verwendung von #pragma managed/unmanaged
- 24. Verwendung von C# -Schnittstellen zur Erweiterung bestehender Anwendungen
- 25. #define Verwendung in C/C++
- 26. Schnelle Schritte zur Verwendung von C-Code mit Java
- 27. Alternativen zu SharpZipLib zur Verwendung mit .Net C# -Anwendung
- 28. Benutzerdefinierte Schriftart Verwendung in Windows Phone 8
- 29. xsd.exe - Schema zur Klasse - zur Verwendung mit WCF
- 30. Datumsstempel zur Verwendung als Teil der Zeichenfolge in Jmeter
Vielen Dank für Ihre Hilfe Thomas und Ash – kthakore