Laden Sie eine TTF-Schriftart aus dem Dateisystem, ohne sie als Ressource einzubettenC#

Ein Treffpunkt für C#-Programmierer
Guest
 Laden Sie eine TTF-Schriftart aus dem Dateisystem, ohne sie als Ressource einzubetten

Post by Guest »

Ich habe eine Windows Forms-Anwendung und versuche, eine Schriftart aus einer Datei zu verwenden. Konkret handelt es sich um die Schriftart B612, aber ich glaube nicht, dass sie einen Unterschied macht.
Ich habe versucht, sie mit der Methode PrivateFontCollection.AddFontFile(string) zu laden. Die Schriftart sollte ordnungsgemäß geladen werden, da ich keine Ausnahmen erhalte und ich auch die Schriftfamilien der Sammlung iteriere und die Schriftart vorhanden ist. Das hat leider ein Problem: Es funktioniert nicht. Der Text wird mit der Fallback-Schriftart gerendert.
Ich habe sogar versucht, dieses Beispiel von Microsoft auszuführen. Ohne die Schriftart zu installieren:
Image

Nach der Installation der Schriftart:
Image

Bitte beachten Sie das für den Fall Die Schriftartdateien befinden sich im erwarteten Verzeichnis. Andernfalls würde das Programm nicht ausgeführt.
Das Obige ist völlig nutzlos, da ich möchte, dass die Benutzer ihre Schriftarten direkt in einem Verzeichnis ablegen können, da sie möglicherweise nicht über alle Administratorrechte verfügen um eine Schriftart zu installieren. Das Einbetten der Schriftart als Ressource hilft auch nicht, da dadurch die Flexibilität verloren geht.
Ist es möglich, eine Schriftart aus einer Datei zu laden, ohne sie zu installieren?
Ich versuche es gerade .NET Framework 4.8 Windows 10.0.19045
Nachtrag
Ja, ich weiß, dass ich keinen Code gepostet habe. Der Code befindet sich jedoch in dem Beispiel, das ich verlinkt habe. Zugegeben, im Internet gibt es mehr tote als aktive Links. Hier ist also eine leicht modifizierte Version des Beispiels, auf dem die Screenshots basieren:

Code: Select all

    public partial class Form1 : Form
{
private FontFamily[] fontFamilies;
public Form1()
{
InitializeComponent();
PrivateFontCollection privateFontCollection = new PrivateFontCollection();
string[] ttfFiles = Directory.GetFiles("path to the fonts", "*.ttf");
foreach (string ttfFile in ttfFiles)
{
privateFontCollection.AddFontFile(ttfFile);
}

fontFamilies = privateFontCollection.Families;
Disposed += (_, _) =>
{
Console.WriteLine("Disposing");
privateFontCollection.Dispose();
};
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
PointF pointF = new PointF(10, 0);
SolidBrush solidBrush = new SolidBrush(Color.Black);

int count = 0;

count = fontFamilies.Length;

for (int j = 0; j < count; ++j)
{
string familyName = fontFamilies[j].Name;

if (fontFamilies[j].IsStyleAvailable(FontStyle.Regular))
{
Font regFont = new Font(
familyName,
16,
FontStyle.Regular,
GraphicsUnit.Pixel);

e.Graphics.DrawString(
$"{familyName} {FontStyle.Regular}",
regFont,
solidBrush,
pointF);

pointF.Y += regFont.Height;
}
//so on and so forth for the rest of the styles

pointF.Y += 10;
}
}
}
Ich habe versucht, das Beispiel so nah wie möglich am Original zu halten. Meine Änderungen bestanden darin, den sich wiederholenden Code für die restlichen Schriftstile zu entfernen, die absurden Kommentare zu entfernen, die das Offensichtliche angeben, und die Initialisierung und Entsorgung auf den Konstruktor zu verschieben.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post