Neigungswinkel bei kursiver Schrift

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

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

    Neigungswinkel bei kursiver Schrift

    Guten Tag,

    wenn es so etwas gibt, würde ich gerne den Neigungswinkel bei kursiver Schrift (Italic) einer bereits vorhandenen Schriftart auslesen. Alle Eigenschaften eines Zeichensatzes sind wohl in der Struktur LOGFONT gespeichert und ich schaffe es einfach nicht, diese auszulesen. Ich gehe davon aus, dass die Information, die ich benötige, im Teil lfEscapement oder lfOrientation möglicherweise zu finden ist. Nachdem ich es zunächst mit API-Funktionen versucht habe, entdeckte ich die Methode Font.toLogfont(Object). Auch da scheitere ich leider an der korrekten Parameterübergabe (ich habe es mit einer Klasse probiert, in der ich die Struktur von LOGFONT definiert habe). Ich denke, mit meinem Quelltext könnt ihr in dieser Sache nichts anfangen, den er ist sicherlich jenseits von gut und böse. Bitte entschuldigt, aber ich betreibe das Programmieren nur hobbymäßig und deshalb bitte ich nach unzähligen Fehlversuchen nun um Hilfe. Danke. ?(
    @Hebbe Ich denke mal, dass Dein Quelltext schon hilfreich wäre, um Dein Problem anzugehen.
    Ob es allerdings ühaupt funktioniert, kann ich Dir nicht sagen.
    Vielleicht gehst Du das Problem anders herum an:
    Erstelle einen neuen Font mit vorgegebenem Winkel.
    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!

    LOGFONT auslesen

    Hallo RodFromGermany,

    danke für Deine Kontaktaufnahme. Selbst einen Font zu erstellen, ist in meinem Fall nicht möglich. Ich entwickle geänderte Carets, die z.B. so breit wie das gewählte Zeichen sind. Das funktioniert schon gut. Bei Kursivschrift verwende ich einen geneigten Bitmap, auch das habe ich hinbekommen. Leider sind die Neigungswinkel bei den verschiedenen Kursivschriften nicht gleich, deshalb meine Idee, den Winkel jeweils aus der Schriftart auszulesen. Ich bin etwas weitergekommen, die Struktur des Logfontes lese ich mit folgendem Code ein:

    VB.NET-Quellcode

    1. <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)>
    2. Public Structure LOGFONT
    3. Public lfHeight As Int32
    4. Public lfWidth As Int32
    5. Public lfEscapement As Int32
    6. Public lfOrientation As Int32
    7. Public lfWeight As Int32
    8. Public lfItalic As Byte
    9. Public lfUnderline As Byte
    10. Public lfStrikeOut As Byte
    11. Public lfCharSet As Byte
    12. Public lfOutPrecision As Byte
    13. Public lfClipPrecision As Byte
    14. Public lfQuality As Byte
    15. Public lfPitchAndFamily As Byte
    16. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)>
    17. Public lfFaceName As String
    18. End Structure


    Diese Struktur lese ich dann z.B. im Form_load Ereignis_auf diese Art ein:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim LF As LOGFONT = New LOGFONT
    3. MeineTextbox.Font.ToLogFont(logFont:=LF)
    4. end sub


    Ich bekomme so (nach unzähligen Fehlversuchen, einschließlich vieler Abstürze) keine Fehlermeldung und das Programm läuft anstandslos durch. Doch leider ist nach Aufruf der Methode LogFont LF natürlich wie vorher.
    Ich bin mir nicht mal sicher, ob die gewünschte Information überhaupt in der Schriftart enthalten ist, denn bei echten Kursiven ist es ja wohl ein extra Font.
    Nochmals: Entschuldigt bitte, wenn das allzu naiv rüberkommt.

    Hebbe

    Hebbe schrieb:

    die Struktur des Logfontes lese ich mit folgendem Code ein
    Es wäre fein, wenn Du den Code noch postest.
    Sorry, Du liest Deinen Font ja aus.
    Allerdings passiert da nix, alles Nullen:
    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!

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

    Hallo RodFromGermany,
    ​Sorry, Du liest Deinen Font ja aus.

    ja, ich lese den selbst erstellten Font aus. Ich hatte die Vorstellung, dass es sich bei der Methode MeineTextbox.Font.ToLogFont(logFont-Object) um das Auslesen eines bereits bestehenden Fonts handeln würde. Das ist es ja, was ich benötige. Ich kam darauf, weil es sich bei den Eigenschaften, die .Net anbietet, ja auch um bestehende Fonts handelt (Fonds.bolt usw.). Auch eine weitere Methode (Handle=Me.Font.ToHfont) gibt als Funktion das Handle der angegebenen Font zurück. Es wird als Parameter ja eine LOGFONT As Object verlangt. Meine Vorstellung wider besseres Wissen war, ich übergebe einfach so eine Struktur und die Werte werden dann dort eingetragen. Wenn die SUB nur dazu dient, eine neue Font zu erzeugen, kann ich damit nichts anfangen. Kann man mit .Net oder der API denn eine logFont-Struktur einer bestehenden Font bestimmen? Wenn ja, wäre ich dankbar, wenn mir jemand auf die Sprünge helfen kann. Danke. Hebbe
    Hier findest du Code, der funktionieren müsste: github.com/zhuangyy/Motion/blo…Forge.Win32/FontHelper.cs
    Ggf. kannst du den durch einen Konverter jagen, um aus dem C#-Code VB.NET-Code zu erhalten
    Der auffälligste Unterschied ist, dass es eine Klasse und kein Struct ist, was dein Problem erklären würde, da du bei einem Struct auch keine Daten zurück erhalten kannst.
    @Hebbe Font erzeugen geht so (Form mit 2 Button und einem Label):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports System.Text
    3. Public Class Form1
    4. <DllImport("gdi32.dll")> _
    5. Private Shared Function CreateFont(
    6. ByVal nHeight As Int32,
    7. ByVal nWidth As Int32,
    8. ByVal nEscapement As Int32,
    9. ByVal nOrientation As Int32,
    10. ByVal fnWeight As Int32,
    11. ByVal fdwItalic As UInt32,
    12. ByVal fdwUnderline As UInt32,
    13. ByVal fdwStrikeOut As UInt32,
    14. ByVal fdwCharSet As Int32,
    15. ByVal fdwOutputPrecision As UInt32,
    16. ByVal fdwClipPrecision As UInt32,
    17. ByVal fdwQuality As UInt32,
    18. ByVal fdwPitchAndFamily As UInt32,
    19. ByVal lpszFace As String
    20. ) As IntPtr
    21. End Function
    22. <DllImport("gdi32.dll")> _
    23. Private Shared Function DeleteObject(hObject As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    24. End Function
    25. <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)>
    26. Public Structure LOGFONT
    27. Public lfHeight As Int32
    28. Public lfWidth As Int32
    29. Public lfEscapement As Int32
    30. Public lfOrientation As Int32
    31. Public lfWeight As Int32
    32. Public lfItalic As Byte
    33. Public lfUnderline As Byte
    34. Public lfStrikeOut As Byte
    35. Public lfCharSet As Byte
    36. Public lfOutPrecision As Byte
    37. Public lfClipPrecision As Byte
    38. Public lfQuality As Byte
    39. Public lfPitchAndFamily As Byte
    40. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)>
    41. Public lfFaceName As String
    42. Public Overloads Function ToString() As String
    43. Dim sb = New StringBuilder()
    44. sb.AppendLine("LOGFONT")
    45. sb.AppendFormat(" lfHeight: {0}{1}", lfHeight, Environment.NewLine)
    46. sb.AppendFormat(" lfWidth: {0}{1}", lfWidth, Environment.NewLine)
    47. sb.AppendFormat(" lfEscapement: {0}{1}", lfEscapement, Environment.NewLine)
    48. sb.AppendFormat(" lfOrientation: {0}{1}", lfOrientation, Environment.NewLine)
    49. sb.AppendFormat(" lfWeight: {0}{1}", lfWeight, Environment.NewLine)
    50. sb.AppendFormat(" lfItalic: {0}{1}", lfItalic, Environment.NewLine)
    51. sb.AppendFormat(" lfUnderline: {0}{1}", lfUnderline, Environment.NewLine)
    52. sb.AppendFormat(" lfStrikeOut: {0}{1}", lfStrikeOut, Environment.NewLine)
    53. sb.AppendFormat(" lfCharSet: {0}{1}", lfCharSet, Environment.NewLine)
    54. sb.AppendFormat(" lfOutPrecision: {0}{1}", lfOutPrecision, Environment.NewLine)
    55. sb.AppendFormat(" lfClipPrecision: {0}{1}", lfClipPrecision, Environment.NewLine)
    56. sb.AppendFormat(" lfQuality: {0}{1}", lfQuality, Environment.NewLine)
    57. sb.AppendFormat(" lfPitchAndFamily: {0}{1}", lfPitchAndFamily, Environment.NewLine)
    58. sb.AppendFormat(" lfFaceName: {0}{1}", lfFaceName, Environment.NewLine)
    59. Return sb.ToString()
    60. End Function
    61. End Structure
    62. Private FontDc As IntPtr
    63. Private MyFont As Font
    64. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    65. ' funktioniert nicht!
    66. Dim LF As LOGFONT = New LOGFONT
    67. Me.Label1.Font.ToLogFont(LF)
    68. MessageBox.Show(LF.ToString())
    69. End Sub
    70. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    71. Me.FontDc = Form1.CreateFont(20, 100, 0, 0, 400, 0, 0, 0, 1, 0, 0, 4, 0, "Myriad Pro")
    72. Me.MyFont = Font.FromHfont(Me.FontDc)
    73. Me.Label1.Font = Me.MyFont
    74. End Sub
    75. Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    76. Form1.DeleteObject(Me.FontDc)
    77. End Sub
    78. End Class
    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!