Justifying text using DrawString in C#
I'm drawing text on a System.Drawing.Graphics
object. I'm using the DrawString
method, with the text string, a Font
, a Brush
, a bounding RectangleF
, and a StringFormat
as arguments.
Looking into StringFormat
, I've found that I can set it's Alignment
proper开发者_开发问答ty to Near
, Center
or Far
. However I haven't found a way to set it to Justified. How can I achieve this?
Thank you for your help!
I FOUND IT :)
http://csharphelper.com/blog/2014/10/fully-justify-a-line-of-text-in-c/
in brief - you can justify text in each separate line when you know the given width of the entire paragraph:
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
the rest is pretty intuitive:
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.
}
There is no built-in way to do it. Some work-arounds are mentioned on this thread:
http://social.msdn.microsoft.com/Forums/zh/winforms/thread/aebc7ac3-4732-4175-a95e-623fda65140e
They suggest using an overridden RichTextBox
, overriding the SelectionAlignment
property (see this page for how) and setting it to Justify
.
The guts of the override revolve around this pInvoke call:
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);
Not sure how well this can be integrated into your existing model (since I assume you're drawing more than text), but it might be your only option.
精彩评论