2012-02-02 1 views
3

Я пытаюсь создать элемент управления, который в принципе позволяет мне рисовать разные строки под друг другом. Однако ширина строк не может быть больше, чем у элементов управления. Чтобы решить эту проблему, я думал о передаче объекта RectangleF методу Graphics.DrawString. Это будет обертывать строки, которые шире ширины пройденного прямоугольника. Хотя это и решает проблему неспособности видеть всю строку, если она слишком велика, есть еще одна проблема. Если бы я попробовать что-то вроде этогоИзмерение завернутой строки

Graphics g = e.Graphics; // Paint event 
g.DrawString(someText, someFont, someBrush, new PointF(0, 0), someRectangleF); 
g.DrawString(someMoreText, someFont, someBrush, new PointF(0, 12), someRectangleF); 

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

Я искал решение этой проблемы, и нашел некоторые интересные ссылки, которые, однако, включали использование цикла for, который бы измерял ширину каждого символа и так далее. Есть ли более простые способы сделать это?

+0

Вы считаете, что используете TextBlock с упаковкой? Элемент управления, который вы пытаетесь создать, похоже на ListView. Почему пользовательский контроль? – Paparazzi

+0

Я действительно рассматривал использование ListView. Однако мой контроль представляет собой график, который моя программа сможет распечатать. И напечатанные ListViews действительно не выглядят хорошо, поэтому я пытался создать свой собственный контроль. О, и простите, я забыл упомянуть, что я использую WinForms. Я отредактировал свой вопрос. – haiyyu

ответ

5

Можете ли вы использовать метод Graphics.MeasureString, чтобы получить размеры строки и соответствующим образом нарисовать следующую строку?

SizeF size = g.MeasureString(someText, someFont, someRectangleF.Size.Width); 
g.DrawString(someText, someFont, someBrush, new PointF(0, 0), someRectangleF); 
g.DrawString(someMoreText, someFont, someBrush, new PointF(0, size.Height), someRectangleF); 
+0

К сожалению нет, я пробовал это. Функция MeasureString не поддерживает перенос слов. – haiyyu

+5

Он делает, чтобы процитировать документацию «Параметр width указывает максимальное значение компонента ширины возвращаемой структуры SizeF (Width). Если параметр width меньше фактической ширины строки, возвращаемый компонент Width усекается до значение, представляющее максимальное количество символов, которое будет соответствовать указанной ширине. Чтобы разместить всю строку, возвращаемый компонент Height доводится до значения, которое позволяет отображать строку с оберткой символов. " http://msdn.microsoft.com/en-us/library/9bt8ty58.aspx –

+0

О, я вижу. Я действительно прочитал эту страницу, я, должно быть, неправильно ее понял. Благодаря! – haiyyu