Определение позиции строки после ее отрисовки с использованием WinForms (C #) - PullRequest
0 голосов
/ 17 мая 2009

Я рисую строку в большом ограничивающем прямоугольнике и использую StringFormat для правильного выравнивания строки. Однако мне нужно фактическое (X, Y) расположение строки после ее отрисовки (а не только размер, заданный MeasureString).

Я использую код ниже:

CharacterRange[] ranges = { new CharacterRange(0, this.Text.Length) };
format.SetMeasurableCharacterRanges(ranges);

//Measure character range
Region[] region = g.MeasureCharacterRanges(this.Text, this.Font, layoutRect, format);
RectangleF boundsF = region[0].GetBounds(g);
bounds = new Rectangle((int)boundsF.Left, (int)boundsF.Top,
                       (int)boundsF.Width, (int)boundsF.Height);

Это сегмент кода, поэтому игнорируйте пропущенные объявления. Дело в том, что прямоугольник, который дает приведенный выше код, имеет неверный размер, последний символ строки отбрасывается, и рисуется только первая строка.

Кто-нибудь знает почему, или, может быть, лучший способ сделать это?

Спасибо

Ответы [ 3 ]

2 голосов
/ 17 мая 2009

Убедитесь, что вы используете правильный формат для измерения вашего текста. Вы не включили весь исходный код, поэтому я не могу сказать, если вы.

Существует два «стандартных» значения формата, которые вы можете использовать: StringFormat.GenericTypographic и StringFormat.GenericDefault. Если память используется, то по умолчанию выбирается GenericDefault, но при рендеринге пользовательский интерфейс - GenericTypographic.

.

Следовательно, вместо того, чтобы делать new StringFormat(), вы хотите вместо этого сделать StringFormat.GenericTypographic.Clone(). Это должно исправить поля и интервалы и дать вам результаты измерений, которые соответствуют тому, что вы видите на поверхности Graphics.

Стратегия, которую я обычно использую, состоит в том, чтобы создать один экземпляр StringFormat и использовать его как для визуализации текста, так и для измерения, чтобы убедиться, что все выстроено в линию - я избегаю любого метода, который позволяет мне пропустить StringFormat, поскольку по умолчанию, вероятно, нет ' т, что я хочу.

Надеюсь, это поможет. Если у вас все еще возникают проблемы, попробуйте опубликовать более полный фрагмент кода, чтобы мы могли видеть, как вы рисуете свой текст.

1 голос
/ 17 мая 2009

Использование:

TextBox tb = new TextBox { Text = "Test", Multiline = true };
Size size = System.Windows.Forms.TextRenderer.MeasureText(tb.Text, tb.Font);
Point location = new Point( //Is this what you were looking for?
    tb.Location.X + size.Width, 
    tb.Location.Y + size.Height);

Обратите внимание, что у этого метода есть дополнительные перегрузки, пожалуйста, проверьте.

0 голосов
/ 22 мая 2009

Я определенно использую тот же объект StringFormat для измерения и рисования текста.

В итоге я использую приведенный выше код, а затем снова измеряю с помощью TextRenderer и соответственно корректирую размер и местоположение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...