System.Windows.Forms.TextRenderer.DrawText
metoda tynki sformatowany tekst z lub bez lewy i prawy wyściółka w zależności od wartości parametru flags
:Jak uzyskać dokładne marże tekstowe wykorzystywane przez TextRenderer
TextFormatFlags.NoPadding
- pasuje tekst szczelnie do obwiedni ,TextFormatFlags.GlyphOverhangPadding
- dodaje lewy i prawy margines,TextFormatFlags.LeftAndRightPadding
- dodaje jeszcze większe marginesy.
Teraz moje pytanie jest jak mogę dostać dokładną ilość wyściółki (lewy i prawy) dodane przez DrawText
do tekstu dla danego kontekstu urządzenia, łańcuch, czcionki itp?
Mam wbiły .NET 4 z .NET Reflector i stwierdził, że TextRenderer oblicza „wystającą dopełnienie”, która jest 1/6 wysokości fontu, a następnie mnoży tę wartość do obliczenia marginesu lewego i prawego pomocą tych współczynników:
- lewy, prawy 1,0 1,5 do
TextFormatFlags.GlyphOverhangPadding
, - lewo 2,0 prawym 2,5 do
TextFormatFlags.LeftAndRightPadding
.
Otrzymane wartości są zaokrąglane w górę i przekazywane do funkcji natywnego interfejsu API DrawTextExA
lub DrawTextExW
. Trudno jest odtworzyć ten proces, ponieważ wysokość czcionki jest pobierana nie od System.Drawing.Font
, ale od System.Windows.Forms.Internal.WindowsFont
, a te klasy zwracają różne wartości dla tej samej czcionki. I zaangażowanych jest wiele innych wewnętrznych klas BCL z przestrzeni nazw System.Windows.Forms.Internal
. Dekompilowanie ich wszystkich i ponowne użycie ich kodu w mojej aplikacji nie jest opcją, ponieważ byłaby to poważna zależność od implementacji .NET. Dlatego muszę wiedzieć, czy istnieje jakiś publiczny API w WinForms lub przynajmniej jakie funkcje Windowsa mogę użyć, aby uzyskać wartości lewego i prawego marginesu.
Uwaga: Próbowałem TextRenderer.MeasureText
i bez wyściółki i porównać wyniki, ale to dało mi jedynie sumę lewego i prawego marginesu i muszę je oddzielnie.
Uwaga 2: W przypadku, gdy zastanawiasz się, dlaczego muszę to: Chcę, aby narysować jeden ciąg z wielu czcionek/kolorów. To wymaga wywołania DrawText
raz dla każdego jednolicie sformatowanego podciągu z opcją NoPadding
(aby tekst się nie rozprzestrzeniał), ale chcę też dodać ręcznie normalny GlyphOverhangPadding
na samym początku i na końcu całego tekstu wieloformatowego.
+1 za kompleksową analizę :-). Miałem także ten problem, a wartości lewostronne, które podsłuchałeś, rozwiązały dla mnie - dzięki. – Fedearne