Schriftart wird nicht korrekt eingebettet

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Schriftart wird nicht korrekt eingebettet

    Gutem Tag,

    ich möchte eine Schriftart einbetten. Bei meiner Testapp klappt da auch wunderbar, aber nicht mehr bei meinem Hauptprojekt und ich versteh nicht warum.

    Code zu Beginn in der Form 1:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Drawing.Text
    3. Imports System.Runtime.InteropServices
    4. Imports System.Reflection


    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim pfc As New PrivateFontCollection
    4. Dim resource As String = "ELW_Dashboard.Frutiger CE 55 Roman.ttf"
    5. Dim fontstream As Stream
    6. Dim data As IntPtr
    7. Dim fontdata As Byte()
    8. fontstream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resource)
    9. data = Marshal.AllocCoTaskMem(CInt(fontstream.Length))
    10. fontdata = New Byte(fontstream.Length - 1) {}
    11. fontstream.Read(fontdata, 0, CInt(fontstream.Length))
    12. Marshal.Copy(fontdata, 0, data, CInt(fontstream.Length))
    13. pfc.AddMemoryFont(data, CInt(fontstream.Length))
    14. fontstream.Close()
    15. Marshal.FreeCoTaskMem(data)
    16. ' jetzt werden die labels angepasst
    17. Label1.Font = New Font(pfc.Families(0), 36.0, FontStyle.Regular)
    18. End Sub


    Die Font ist in den Ressourcen und unter Eigenschaften auch eingebettet. Die Schriftgrößenänderung übernimmt er, aber nicht die Font... ?(
    Gruß
    @proxy_sam Pack mal den ganzen Code aus der Form_Load in die Form_Shown.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ==>

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown

    =====
    Wahrscheinlich musst Du die Font-Datei einfach auf die Platte schreiben, dann geht das ganze so (getestet):

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim path As String = Application.StartupPath & "\MyFont.ttf"
    3. System.IO.File.WriteAllBytes(path, My.Resources.Barcode)
    4. Dim privateFonts As System.Drawing.Text.PrivateFontCollection = New System.Drawing.Text.PrivateFontCollection()
    5. privateFonts.AddFontFile(path)
    6. Dim font As Font = New Font(privateFonts.Families(0), 12)
    7. Me.label2.Font = font
    8. Me.label1.Text = path
    9. Me.label2.Text = path
    10. End Sub
    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!
    Das mit Shown hat leider keinen Erfolg gebracht.

    Du meinst, auf die Festplatte vom Ziel-PC? Das möchte ich ja eigentlich verhindern, dass jeder die Fontdatei hat.

    Ich versteh auch nicht, warum es bei meiner blanken Testapp funktioniert und hier nicht...
    Wie gesagt, die Zeile 17, beim definieren der Schriftgröße übernimmt er.

    proxy_sam schrieb:

    VB.NET-Quellcode

    1. Dim resource As String = "ELW_Dashboard.Frutiger CE 55 Roman.ttf"
    Ich denke mal, da steht der falsche Name drin.
    In einem vergleichbaren Zusammenhang steht da bei mir "FontImProjekt.Form1.resources" drin, "FontImProjekt" ist der Name der Exe.
    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!
    .Net kommt nicht mit allen Fonts klar. Es gehen (i.d.R) nur/keine (bin mir grad nicht Sicher) TrueType Fonts
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @proxy_sam Kannst Du mal die Font-Datei als ZIP posten?
    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!

    proxy_sam schrieb:

    Genau die gleiche Font klappt aber in der Testapp von mir.
    Prima, dann wäre die Grundsätzliche unterstützung des Fonts verifiziert. So kommt man Schritt für Schritt dem Problem auf die Spur.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    proxy_sam schrieb:

    Auf Platte schreiben, bedeutet?
    Er befindet sich auf der Festplatte, wie in meinem Snippet in Post #2 beschrienen. Gib der Datei einen unverfänglichen Namen und lösche sie nach Instanziierung des Fonts wieder.
    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!
    Alles klar, das klappt endlich.
    Aber er soll die Datei beim Beenden auch wieder löschen...Wie stell ich das am besten an?

    Kill und

    VB.NET-Quellcode

    1. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    2. My.Computer.FileSystem.DeleteFile("temp.ttf")
    3. End Sub


    verweigert er aufgrund Schutzrechte

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „proxy_sam“ ()

    proxy_sam schrieb:

    aufgrund Schutzrechte
    Zugriff verweigert wegen fremder Benutzung oder fehlenden Admin-Rechten?
    Poste mal die präzise Fehlermeldung.
    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!
    Noch eine Frage:

    VB.NET-Quellcode

    1. Dim path As String = Application.StartupPath & "\MyFont.ttf"

    bedeutet ja, er macht es in das Startverzeichnis. Ich möchte es gerne in einen Unterordner. Das dort einzufügen(z.B. " Application.StartupPath & "\res\MyFont.ttf"), klappt leider nicht.


    Sorry. Hier:

    Quellcode

    1. ************** Ausnahmetext **************
    2. System.UnauthorizedAccessException: Der Zugriff auf den Pfad "C:\C-Dienst\Release\temp.ttf" wurde verweigert.
    3. bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    4. bei System.IO.File.InternalDelete(String path, Boolean checkHost)
    5. bei System.IO.File.Delete(String path)
    6. bei Microsoft.VisualBasic.FileIO.FileSystem.DeleteFileInternal(String file, UIOptionInternal showUI, RecycleOption recycle, UICancelOption onUserCancel)
    7. bei Microsoft.VisualBasic.MyServices.FileSystemProxy.DeleteFile(String file)
    8. bei ELW_Dashboard.Form1.Form1_FormClosing(Object sender, FormClosingEventArgs e)
    9. bei System.Windows.Forms.Form.OnFormClosing(FormClosingEventArgs e)
    10. bei System.Windows.Forms.Form.WmClose(Message& m)
    11. bei System.Windows.Forms.Form.WndProc(Message& m)
    12. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    13. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    14. bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    proxy_sam schrieb:

    klappt leider nicht.
    Da musst Du vor dem Speichern diesen Pfad anlegen.
    Es sieht so aus, als hättest Du nicht das Recht, auf diesen Pfad schreibend zuzugreifen. Probierma das temporäre Verzeichnis.
    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!
    @proxy_sam Besteht das Problem noch?
    Hast Du mal den Temp-Pfad probiert?
    Welche Rechte hast Du in Deiner System-Anmeldung?
    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!
    Temp-Pfad funktioniert prima - Danke.

    Wie stelle ich es jetzt an, dass ich verschiedenen Schriftgrößen/Formate habe?

    VB.NET-Quellcode

    1. Dim font2 As Font = New Font(privateFonts.Families(0), 55)


    einfach zu schreiben und dann die Labels zu deklarieren ist ja leider falsch...