Wie man den genauen Wortlaut Margen verwendet TextRenderer

System.Windows.Forms.TextRenderer.DrawText - Methode rendert formatierten text mit oder ohne Links und rechts Polsterung je nach dem Wert der flags parameter:

  • TextFormatFlags.NoPadding - passt das text-fest in der bounding-box,
  • TextFormatFlags.GlyphOverhangPadding - fügt einige Links und rechts Ränder,
  • TextFormatFlags.LeftAndRightPadding - fügt noch größere Margen.

Nun, meine Frage ist wie bekomme ich die genaue Höhe der Polsterung (Links und rechts) Hinzugefügt von DrawText auf den text für ein bestimmtes device context, string, schriftart etc?

Ich habe gegraben in .NET 4 mit .NET Reflector und festgestellt, dass die TextRenderer-berechnet "überhang " Auffüllen", das ist 1/6 der schriftart, die Höhe und multipliziert dann diesen Wert zur Berechnung des linken und rechten Ränder mittels dieser Koeffizienten:

  • Links 1.0, rechts 1,5 für TextFormatFlags.GlyphOverhangPadding,
  • Links 2.0, rechts 2,5 für TextFormatFlags.LeftAndRightPadding.

Die resultierenden Werte sind gerundet und an den DrawTextExA oder DrawTextExW native API-Funktionen. Es ist schwierig herzustellen dieser Prozess, weil die font-Höhe stammt nicht von System.Drawing.Font aber von System.Windows.Forms.Internal.WindowsFont und diese Klassen zurück, andere Werte für die gleiche schriftart. Und eine Menge von anderen internen BCL-Klassen aus der System.Windows.Forms.Internal namespace beteiligt sind. Die Dekompilierung, alle von Ihnen und wiederverwenden, Ihren code in meine app ist keine option, denn das würde eine ernsthafte .NET-Implementierung der Abhängigkeit. Das ist, warum ich muss wissen, wenn es eine öffentliche API-in WinForms oder zumindest die Windows-Funktionen kann ich verwenden, um die Werte der linken und rechten Ränder.


Hinweis: ich habe versucht, zu TextRenderer.MeasureText mit und ohne Polsterung und die Ergebnisse vergleichen, aber das gab mir nur die Summe des linken und rechten Randes, und ich muss Sie separat.


Hinweis 2: In Fall, dass Sie Fragen, warum brauche ich das: ich will zeichnen Sie eine Zeichenfolge mit mehreren Schriftarten/- Farben. Das umfasst das aufrufen DrawText einmal für alle einheitlich formatiert substring mit NoPadding option (so dass der text nicht mehr zu verbreiten) aber ich möchte auch hinzufügen, manuell normal GlyphOverhangPadding ganz am Anfang und ganz am Ende die ganzen multi-format-text.

  • +1 für die umfassende Analyse :-). Ich hatte auch dieses problem und die Links-Polsterung Werte, die Sie eingeatmet gelöst es für mich - danke.
Schreibe einen Kommentar