[SOLVED] Font in Visual Studio einbetten

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    [SOLVED] Font in Visual Studio einbetten

    Hallo,

    ich habe momentan das Problem, dass ich eine bestimmte Font zu meinem Visual Studio-Programm hinzufügen möchte. Im Endeffekt möchte ich dass die .ttf nicht im Verzeichnis der .exe liegen muss sondern in das Programm eigebunden wird oder sich automatisch in die Windows-Fonts installiert. Es wäre super, wenn jemand eine Lösung dafür hat

    Niklas9401 schrieb:

    eine bestimmte Font zu meinem Visual Studio-Programm hinzufügen
    Soll dieser Font dem Betriebssystem, und damit auch dem Visual Studio, zur Verfügung stehen
    oder
    soll er (auch) den von Dir geschriebenen Programmen zur Verfügung stehen?
    Wenn Du nämlich das Proframm weitergibst, ist dieser Font auf dem anderen Rechner ggf. nicht verfügbar.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    falls du ein Projekt meinst, und das mit einer Schrift laufen soll, auch auf Rechnern auf denen, diese nicht installiert ist:

    VB.NET-Quellcode

    1. 'main bzw. aufruf:
    2. Public Class Main
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Label1.Font = CustomFont.GetInstance(12, FontStyle.Bold)
    5. Label1.UseCompatibleTextRendering = True
    6. End Sub
    7. End Class
    8. 'Module
    9. Imports System.Runtime.InteropServices
    10. Imports System.Drawing.Text
    11. Module CustomFont
    12. Private _pfc As PrivateFontCollection = Nothing
    13. Public ReadOnly Property GetInstance(ByVal Size As Single, ByVal style As FontStyle) As Font
    14. Get
    15. If _pfc Is Nothing Then LoadFont()
    16. Return New Font(_pfc.Families(0), Size, style)
    17. End Get
    18. End Property
    19. Private Sub LoadFont()
    20. Try
    21. _pfc = New PrivateFontCollection
    22. Dim fontMemPointer As IntPtr = Marshal.AllocCoTaskMem(My.Resources.DIGITALDREAMNARROW.Length)
    23. Marshal.Copy(My.Resources.DIGITALDREAMNARROW, 0, fontMemPointer, My.Resources.DIGITALDREAMNARROW.Length)
    24. _pfc.AddMemoryFont(fontMemPointer, My.Resources.DIGITALDREAMNARROW.Length)
    25. Marshal.FreeCoTaskMem(fontMemPointer)
    26. Catch ex As Exception
    27. End Try
    28. End Sub
    29. End Module


    DIGITALDREAMNARROW ersetzen durch wie auch immer deine schrift in den resourcen heisst
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    @asusdk Suboptimal.
    Font ist ein IDisposable, also mach eine Klasse drum, die ebenfalls IDisposable ist, so dass der ganze unmanaged Overhead weggeräumt werden kann.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Niklas9401 Dann solltest Du das auch so tun.
    Pack den Font als Binary in Deine Ressourcen, kopiere ihn neben die Exe und verwende ihn als externen Font, gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Niklas9401 schrieb:

    wie das geht
    1. Hinzufügen der Font-Datei zu den Ressourcen des Programms:
      Projekt => Eigenschaften => Ressourcen => Ressource hinzufügen
      Vorhandene Datei hinzufügen => Datei auswählen
      Namen der Ressource merken
    2. C#-Quellcode

      1. string path = Application.StartupPath + "\\MyFont.ttf"; // dorthin wird der Font extrahiert
      2. System.IO.File.WriteAllBytes(path, WindowsFormsApplication1.Properties.Resources.Barcode); // das Extrahieren
      3. System.Drawing.Text.PrivateFontCollection privateFonts = new System.Drawing.Text.PrivateFontCollection(); // externe Font-Collection anlegen
      4. privateFonts.AddFontFile(path); // Font von Datei hinzufügen
      5. System.Drawing.Font font = new Font(privateFonts.Families[0], 12); // instanziieren
      6. label2.Font = font; // zuweisen
      7. label1.Text = path; // normal
      8. label2.Text = path; // mit dem Font

    3. Ansehen:

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    jvbsl schrieb:

    wieso IDisposable
    Versteh ich jetzt nicht. :/
    Ja, ich hab das Aufräumen mal einfach ignoriert. :whistling:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Niklas9401 schrieb:

    Wohin soll der Code?
    Keine Ahnung, ich kenn doch Dein Projekt nicht.
    Pack ihn zunächst in eine Button_Click. Erforsche wie er funktioniert, dann sollte Dir Klar werden, wo Du ihn einbauen musst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany: Ich erwarte von einer Factory nicht, dass sie den Datenmüll auch aufräumt, erwarte ich bei new ja auch nicht.

    Edit: CreateInstance wäre natürlich ein sinnvollerer Name
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---