2011-09-21 23 views
5

Rysuję tekst na obiekcie System.Drawing.Graphics. Używam metody DrawString z ciągiem tekstowym, Font, Brush, ograniczającym RectangleF i StringFormat jako argumentami.Justowanie tekstu za pomocą DrawString w C#

Patrząc StringFormat, odkryłem, że mogę ustawić to Alignment nieruchomość do Near, Center lub Far. Jednak nie znalazłem sposobu, aby ustawić go na Justified. Jak mogę to osiągnąć?

Dziękuję za pomoc!

Odpowiedz

1

Nie ma wbudowanego sposobu, aby to zrobić. Niektóre obejścia są wymienione w tym wątku:

http://social.msdn.microsoft.com/Forums/zh/winforms/thread/aebc7ac3-4732-4175-a95e-623fda65140e

Sugerują przy użyciu nadpisane RichTextBox, przesłanianie właściwość (patrz this page for how) SelectionAlignment i ustawienie go na Justify.

Wnętrzności override krążą wokół tej rozmowy pinvoke:

PARAFORMAT fmt = new PARAFORMAT(); 
fmt.cbSize = Marshal.SizeOf(fmt); 
fmt.dwMask = PFM_ALIGNMENT; 
fmt.wAlignment = (short)value; 

SendMessage(new HandleRef(this, Handle), // "this" is the RichTextBox 
    EM_SETPARAFORMAT, 
    SCF_SELECTION, ref fmt); 

nie wiem, jak dobrze może to być zintegrowane z istniejącym modelu (od Zakładam, że rysunek ponad tekstu), ale może bądź jedyną opcją.

1

znalazłem :) To

http://csharphelper.com/blog/2014/10/fully-justify-a-line-of-text-in-c/

w skrócie - można uzasadnić tekst w każdej oddzielnej linii, gdy wiesz daną szerokość całego akapitu:

float extra_space = rect.Width - total_width; // where total_width is the sum of all measured width for each word 
int num_spaces = words.Length - 1; // where words is the array of all words in a line 
if (words.Length > 1) extra_space /= num_spaces; // now extra_space has width (in px) for each space between words 

reszta jest całkiem intuicyjny:

float x = rect.Left; 
float y = rect.Top; 
for (int i = 0; i < words.Length; i++) 
{ 
    gr.DrawString(words[i], font, brush, x, y); 

    x += word_width[i] + extra_space; // move right to draw the next word. 
} 
Powiązane problemy