System.Windows.Forms.TextRenderer.DrawText
Methode Text mit oder ohne links und rechts padding je nach dem Wert des flags
Parameter formatiert rendert:Wie die genauen Textränder von TextRenderer- gewöhnen
TextFormatFlags.NoPadding
- passt den Text fest in den BegrenzungsrahmenTextFormatFlags.GlyphOverhangPadding
- fügt einige linke und rechte Ränder hinzu,TextFormatFlags.LeftAndRightPadding
- fügt sogar größere Ränder hinzu.
Nun meine Frage ist wie kann ich die genaue Höhe der Polsterung (links und rechts) erhalten hinzugefügt von DrawText
dem Text für einen bestimmten Gerätekontext, string, Schriftart usw.?
Ich habe in .NET 4 mit .NET Reflector gegraben und festgestellt, dass TextRenderer "Überhang Polsterung" berechnet, die 1/6 der Schrifthöhe ist und multipliziert dann diesen Wert, um linke und rechte Ränder mit diesen Koeffizienten zu berechnen:
- 1,0 links, rechts 1,5 für
TextFormatFlags.GlyphOverhangPadding
, - 2.0, rechts für
TextFormatFlags.LeftAndRightPadding
2,5 belassen.
Die resultierenden Werte sind abgerundet und an den DrawTextExA
oder DrawTextExW
native API-Funktionen. Es ist schwierig, diesen Prozess neu zu erstellen, da die Höhe der Schrift nicht von System.Drawing.Font
, sondern von System.Windows.Forms.Internal.WindowsFont
stammt und diese Klassen unterschiedliche Werte für die gleiche Schriftart zurückgeben. Und viele andere interne BCL-Klassen aus dem Namespace System.Windows.Forms.Internal
sind beteiligt. Sie alle zu kompilieren und ihren Code in meiner App wiederzuverwenden, ist keine Option, da dies eine ernsthafte Abhängigkeit von der .NET-Implementierung wäre. Deshalb muss ich wissen, ob es eine öffentliche API in WinForms gibt oder zumindest welche Windows-Funktionen ich verwenden kann, um die Werte der linken und rechten Ränder zu erhalten.
Hinweis: Ich habe versucht, zu TextRenderer.MeasureText
mit und ohne Polsterung und die Ergebnisse zu vergleichen, aber das gab mir nur die Summe der linken und rechten Rand und ich brauche sie getrennt.
Anmerkung 2: Falls Sie sich fragen, warum ich das brauchen: Ich möchte eine Zeichenfolge zeichnen mit mehreren Schriften/Farben. Das beinhaltet Aufruf DrawText
einmal für jeden einheitlich formatierten Teilstring mit NoPadding
Option (so dass der Text nicht verbreitet), aber ich möchte auch manuell normal GlyphOverhangPadding
ganz am Anfang und Ende des gesamten Multi-Format-Text hinzufügen.
+1 für die umfassende Analyse :-). Ich hatte auch dieses Problem und die Links-Padding-Werte, die Sie geschnüffelt haben, lösten es für mich - danke. – Fedearne