Обоснование текста с помощью DrawString в C # - PullRequest
5 голосов
/ 21 сентября 2011

Я рисую текст на System.Drawing.Graphics объекте.Я использую метод DrawString, с текстовой строкой, Font, Brush, ограничивающим RectangleF и StringFormat в качестве аргументов.

Просмотр StringFormatЯ обнаружил, что могу установить для свойства Alignment значение Near, Center или Far.Однако я не нашел способ установить его на Оправданный.Как мне этого добиться?

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 21 января 2016

Я НАШЕЛ ЭТО:)

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

вкратце - вы можете выравнивать текст в каждой отдельной строке, если вы знаете заданную ширину всего абзаца:

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

остальное довольно интуитивно понятно:

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.
}
1 голос
/ 21 сентября 2011

Нет встроенного способа сделать это.В этой теме упоминаются некоторые обходные пути:

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

Они предлагают использовать переопределенный RichTextBox, переопределяющий свойство SelectionAlignment (см. на этой странице, чтобы узнать, как ) и установив его на Justify.

Суть переопределения вращается вокруг этого вызова 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);

Не уверен, насколько хорошо это можно интегрировать в существующую модель (так как я предполагаю, что вы рисуете больше, чем текст), но это может быть вашим единственным вариантом.

...