2009-09-24 3 views
1

Я пишу функцию, которая применяет специальное форматирование к заданным ключевым словам при печати строки. Например, в строке - «Почему это не будет работать?» Мне может потребоваться напечатать слово «Почему» подчеркнуто и синим.Как правильно разместить несколько фрагментов строк в пределах одного ограничивающего прямоугольника при притяжении с помощью C#?

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

Я использую ограничивающие прямоугольники для размещения строк на печатной странице.

RectangleF rectKeywordBounds = new RectangleF(60.0, 60.0, 550.0, 1200.0); 

После того, как я напечатал сегмент строки, я могу изменить размер прямоугольника по количеству символов нарисованных и напечатать следующий сегмент строки.

EArgs.Graphics.DrawString(strFragment, fontBlueItalics, Brushes.Blue, rectKeywordBounds); 
iLastPrintIndex = strFragment.Length + iLastPrintIndex; 

Я использовал этот метод, чтобы изменить положение печати нового сегмента строки:

rectKeywordBounds = new Rectangle(rectKeywordBounds .X + iLastPrintIndex, rectKeywordBounds .Y, rectKeywordBounds .Width, rectKeywordBounds .Height); 

И я использовал это:

properSpacing = new SizeF(-((float)iLastPrintIndex), 0.0f); 
rectKeywordBounds .Inflate(properSpacing); 

Оба метода приводят к такое же перекрытие сегментов. Следующий код продвигает ограничивающий прямоугольник в ожидаемом мне виде, поэтому почему концепция не работает при печати текста внутри прямоугольника?

Rectangle rectKeywordBounds = new Rectangle(90, 90, 800, 100); 

for (int x = 0; x < 6; x++) 
{ 
    EventArgs.Graphics.DrawRectangle(Pens.BlueViolet, rectKeywordBounds); 
    rectKeywordBounds = new Rectangle(rectKeywordBounds .X + 15, rectKeywordBounds .Y + 200, rectKeywordBounds .Width, rectKeywordBounds .Height);    
} 

ответ

1

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

Вместо этого вы должны использовать метод Graphics.MeasureString, чтобы вычислить, сколько места требуется для печати текущего сегмента, и значительно увеличить прямоугольник. Вы также можете сделать это за один раз, используя Graphics.MeasureCharacterRanges, если вы используете один и тот же шрифт для всех сегментов.

Кстати, если у вас есть возможность использовать WPF вместо GDI +, тогда класс TextBlock позаботится обо всех измерениях и макетах для вас.

+0

Спасибо, itowlson. Вот и все! – GFalcon