2013-03-04 2 views
1

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

Первая итерация кода работает очень хорошо, но клиент хочет, чтобы шрифт был больше, чтобы графику было легче читать. Вот отрывок из той части, которая генерирует текст:

using (Graphics Graphic = Graphics.FromImage(Img)) 
{ 
    // Add Some Padding 
    Width = Width - 20; 
    Height = Height - 20; 

    // Generate The Text 
    Font GraphicFont = new Font("Arial", 26, FontStyle.Bold); 
    RectangleF RectF = new RectangleF(10, 10, (float)Width, (float)Height); 
    StringFormat sf = new StringFormat(); 
    sf.Alignment = StringAlignment.Near; 
    sf.LineAlignment = StringAlignment.Near; 
    Graphic.DrawString(Title, GraphicFont, Brushes.Black, RectF, sf); 
} 

Есть ли можно обнаружить текст переполнение в моем RectangleF, или я могу определить размер моей DrawString, прежде чем я применить его к графику, или есть какие-то Другая магия, которую я могу сделать, чтобы получить текст, чтобы заполнить графику?

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

+0

Вам нужно будет протестировать несколько предварительно выбранных размеров шрифта и выбрать тот, который соответствует прямоугольнику. Переход от, скажем, 8 пунктов к 24 пунктам с шагом 2. Не используйте бинарный поиск, он нестабилен. И используйте TextRenderer, когда вывод выводится на экран вместо принтера. –

+0

Спасибо за консультацию; если бы я сделал это с вашим предложенным способом, как бы узнать, переполнен ли текст указанным прямоугольником? – edcs

+0

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

ответ

2

Использование Graphics.MeasureString (документация: http://msdn.microsoft.com/en-us/library/6xe5hazb.aspx)

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

+0

Будьте добры, чтобы получить код примера, который OP, вероятно, использовал после принятия этого ответа – PandaWood

Смежные вопросы