Drucken mehrzeilig mit maximaler Grösse

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Drucken mehrzeilig mit maximaler Grösse

    Hallo zusammen

    Ich stehe wieder einmal auf dem Schlauch. Ich möchte beim Ausdruck die maximale Schriftgrösse ermittlen. Grunsätzlich können bis zu 3 Zeilen entsehen. Ich dachte das könnte ich mit e.Graphics.MeasureString ganz einfach ermittlen. Leider funktioniert das überhaupt nicht. Hat mir jemand einen Tipp?

    Besten Dank

    VB.NET-Quellcode

    1. e.Graphics.PageUnit = GraphicsUnit.Millimeter
    2. '####TEST
    3. Dim TestString As String = "20/21/22-25"
    4. Dim bPen As New Pen(Color.Black, 1)
    5. Dim Rahmen As New Rectangle(5, 5, 205, 100)
    6. Dim dFormat As New StringFormat()
    7. dFormat.Alignment = StringAlignment.Center
    8. dFormat.LineAlignment = StringAlignment.Center
    9. Dim maxFontSize As Integer = 200
    10. For size As Integer = maxFontSize To 1 Step -2
    11. Dim dFontA As New Font("Arial", size, FontStyle.Bold)
    12. Dim textSize As SizeF = e.Graphics.MeasureString(TestString, dFontA, Rahmen.Size, dFormat)
    13. If textSize.Width <= Rahmen.Width AndAlso textSize.Height <= Rahmen.Height Then
    14. maxFontSize = size
    15. MsgBox(maxFontSize.ToString)
    16. e.Graphics.DrawRectangle(bPen, Rahmen)
    17. e.Graphics.DrawString(TestString, dFontA, Brushes.Black, Rahmen, dFormat)
    18. Exit For
    19. End If
    20. Next
    @Panter e.Graphics.MeasureString() liefert Dir die Schrifthöhe zu einem gegebenen Font.
    Du brauchst, wenn ich das richtig verstehe, den Font zu einer gegebenen Zeilenhöhe.
    Dann erstell Dir einen Druck-Font mit der entsprechenden Höhe.
    learn.microsoft.com/en-us/dotn…w=netframeworkdesktop-4.8
    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!
    Hallo zusammen

    Ich habe nun eine Lösung gefunden. Ich neheme bei der Funktion MeasureString einen grössere Fläche.


    VB.NET-Quellcode

    1. Sub MaxSchriftgroesseZeichnen(D_Text As String, Rahmen As Rectangle, e As Printing.PrintPageEventArgs, dFormat As StringFormat, maxFontSize As Integer)
    2. 'e.Graphics.PageUnit = GraphicsUnit.Millimeter
    3. Dim bPen As New Pen(Color.Black, 1)
    4. For size As Integer = maxFontSize To 1 Step -2
    5. Dim dFontA As New Font("Arial", size, FontStyle.Bold)
    6. Dim xrahmen As New Size(Rahmen.Width, Rahmen.Height + 50)
    7. Dim textSize As SizeF = e.Graphics.MeasureString(D_Text, dFontA, xrahmen, dFormat)
    8. If textSize.Width <= Rahmen.Width AndAlso textSize.Height <= Rahmen.Height Then
    9. 'e.Graphics.DrawRectangle(bPen, Rahmen)
    10. e.Graphics.DrawString(D_Text, dFontA, Brushes.Black, Rahmen, dFormat)
    11. maxFontSize = size
    12. Exit For
    13. End If
    14. Next
    15. End Sub
    Jo, bei MeasureString mit Size muss man eine Size mit annähernd unendlicher Height nehmen, damit auf jeden Fall der gesamte Text (mit WordUmbruch) reinpasst. Kleine Überarbeitung:

    VB.NET-Quellcode

    1. Private bPen As New Pen(Color.Black, 1) 'als Klassenvariable, damit nicht ständig ein neuer Pen gebaut wird
    2. Sub MaxSchriftgroesseZeichnen(D_Text As String, Rahmen As Rectangle, e As Printing.PrintPageEventArgs, dFormat As StringFormat, maxFontSize As Integer)
    3. For size As Integer = maxFontSize To 1 Step -2
    4. Dim dFontA As New Font("Arial", size, FontStyle.Bold)
    5. Dim xrahmen As New Size(Rahmen.Width, Short.MaxValue) ' xrahmen in Höhe quasi unendlich
    6. Dim textSize As SizeF = e.Graphics.MeasureString(D_Text, dFontA, xrahmen, dFormat)
    7. If textSize.Height <= Rahmen.Height Then
    8. e.Graphics.DrawString(D_Text, dFontA, Brushes.Black, Rahmen, dFormat)
    9. maxFontSize = size
    10. Exit For
    11. End If
    12. Next
    13. End Sub
    (Bei dir Zeile 11: der Test auf textSize.Width <= Rahmen.Width ist unnötig, da ja xrahmen so vorgegeben ist, dass die Bedingung immer zutrifft.)