netlib.narod.ru | < Назад | Оглавление | Далее > |
Класс Graphics содержит много методов для рисования графических фигур, например, линий, кривых, прямоугольников, эллипсов и растровых изображений. Метод этого класса, показывающий текст в форме, называется DrawString (не спутайте этот метод со шнурком, который не дает сползти вашим штанам 1).
DrawString имеет шесть перегруженных версий, но первые три параметра у них всегда одинаковы. Самая простая версия DrawString определяется так:
void DrawString(string str, Font font, Brush brush, float x, float y)
Вы могли предположить, что параметрами DrawString являются строка, которую требуется показать, и координаты места, в котором она появится. Предположить, что к параметрам метода относятся также шрифт, используемый для показа текста, и нечто, называемое Brush (служит для указания цвета текста), вы вряд ли могли, но все же это так. Наличие этих двух параметров является составной частью того, что имеется в виду, когда говорят о GDI+ как о графической системе программирования без информации о состоянии (stateless). Все, что нужно системе для показа различных графических фигур, содержится прямо в вызовах методов.
Обратной стороной такого подхода является то, что вызов DrawString содержит слишком много информации. Вы можете поймать себя на том, что сокращаете второй и третий параметры до одной буквы или ищете другие пути, чтобы сделать вызов метода короче.
Первый параметр DrawString — текстовая строка, которую требуется отобразить, например:
grfx.DrawString("Hello, world!", ...);
Остальные параметры давайте рассмотрим подробнее.
Второй параметр DrawString — шрифт, используемый для рисования текста. Это объект типа Font. Класс Font определен в пространстве имен System.Drawing. О классе Font я многое расскажу в главе 9. Достаточно сказать, что для программ Windows Forms доступно большое количество шрифтов, размеры которых можно масштабировать. Пока мы используем шрифт по умолчанию. Очень удобно, что каждый класс, унаследованный от Control, наследует свойство Font, в котором хранится используемый по умолчанию шрифт элемента управления.
Свойства Control (выборочно)
Тип | Свойство | Доступ | Описание |
Font | Font | Чтение/запись | Используемый по умолчанию шрифт элемента управления |
Сначала вас может смутить, что как свойство, так и класс имеют имя Font, но гарантирую, что через несколько месяцев это перестанет вас беспокоить.
При установке обработчика события Paint для формы объект, для которого выполняется событие, получают приведением типа первого параметра к типу этого объекта:
Form form = (Form)objSender;
Это приведение типа работает, так как objSender действительно является объектом типа Form. Если objSender не объект типа Form (или класс, унаследованный от Form), этот оператор сгенерировал бы исключение. Так что в обработчике события вы можете обращаться к шрифту по умолчанию, используя запись form.Font. Вызов DrawString будет выглядеть примерно так:
grfx.DrawString(str, form.Font, ...);
Если DrawString вызывается несколько раз, можно сначала определить объект типа Font и присвоить ему шрифт по умолчанию:
Font font = form.Font;
В этом операторе слово «font» используется многократно! Первое слово Font — это класс, определенный в пространстве имен System.Drawing; font строчными буквами — объект этого класса. Последний Font — это свойство класса Form. Вызов DrawString принимает вид:
grfx.DrawString(str, font, ...);
Для краткости можно именовать объект типа Font просто буквой f.
Третий параметр DrawString указывает «цвет» символов шрифта. Слово «цвет» я взял в кавычки, так как параметр на самом деле имеет тип Brush (кисть), а кисть может гораздо больше, чем просто закрашивать поверхность одним цветом. В кистях могут использоваться градиентная заливка, или шаблоны-орнаменты, или растровые изображения. Кисти так разнообразны и обладают такими мощными возможностями, что я посвятил им почти целую главу. Но так как это будет глава 17, а вы сейчас читаете вторую, нам пока хватит очень простых кистей.
Проще всего добиться многообразия цветов — использовать класс Brushes. Заметьте: Brushes стоит во множественном числе в отличие от Brush, которое также является именем класса. Класс Brushes содержит 141 статическое неизменямое свойство с такими же именами цветов, что и в классе Color, перечисленных в файле Colors.pdf на компакт-диске, прилагаемом к этой книге. Свойства класса Brushes — это объекты типа Brush. Так как эти свойства статические, к ним обращаются по имени класса и имени свойства:
grfx.DrawString(str, font, Вrushes.PapayaWhip, ...);
Наверное, вы сейчас думаете: «Конечно, очень приятно, что можно выводить текст различными цветами, используя градиенты и шаблоны, но будем реалистами: вероятно, 97,5% текста, который мне нужно показывать, имеет обычный черный цвет. За небольшим исключением я в третьем параметре DrawString буду просто передавать Brushes.Black». Можно также определить объект типа Brush:
Brush brush = Brushes.Black;
и передавать этот объект в 97,5% вызовов DrawString:
grfx.DrawString(str, font, brush, ...);
Конечно, можно даже для краткости использовать имя b.
Но боюсь, что такое использование Brushes.Black может оказаться ошибочным. Вы делаете неявное предположение, что цвет фона формы не будет черным, как кисть. Разве не может так быть? Очень даже может. В этом случае текст окажется невидимым.
И все же я пока разрешаю вам использовать Brushes.Black в вызовах DrawString, но только если вы будете присваивать свойству BackColor формы значение Соlor.White или любой другой цвет фона, на котором виден черный текст. Более правильные подходы я рассмотрю в главе 3.
И, наконец, последние два параметра DrawString указывают горизонтальную (х) и вертикальную (у) координаты точки, где появится левый верхний угол строки текста.
Если вы получили математическое образование или школьная математика травмировала вас настолько, что шрамы навсегда остались в вашем мозге, вы можете себе представить такую двумерную систему координат:
Она известна как декартова система координат и названа по имени французского математика и философа Рене Декарта (1596–1650), который заслужил эту честь изобретением аналитической геометрии и перед которым специалисты в области компьютерной графики в неоплатном долгу 2. Начало координат — точка (0, 0) — является центром. Значения координаты х увеличиваются слева направо, значения у увеличиваются снизу вверх.
Однако это не совсем та система координат, которая используется в большинстве графических сред. Координатная система, в которой значение у увеличивается снизу вверх, не соответствует способу письма большинства западных языков. Кроме того, на заре компьютерной графики программисты выполняли запись напрямую в память видеоадаптера. Буферы видеопамяти начинались с верха экрана, так как луч развертки перемещался сверху вниз. Это в свою очередь вызвано тем, что луч развертки телевизоров также перемещался сверху вниз — такое решение было принято где-то в 60-х.
В среде Windows Forms, как и в большинстве графических сред 3 координатная система по умолчанию имеет начало в левом верхнем углу и выглядит так:
Я написал «координатная система по умолчанию», так как от нее можно перейти к какой-нибудь другой. Это удовольствие нас ожидает в главе 7.
Когда вы рисуете на форме при помощи объекта Graphics, получаемого из класса PaintEventArgs, являющегося в свою очередь параметром обработчика события Paint, все координаты отсчитываются от левого верхнего угла клиентской области формы. Единицами измерения являются пикселы. Значения х увеличиваются слева направо, значения у — сверху вниз.
Повторю: координаты отсчитываются от левого верхнего угла клиентской области. Это область внутри формы, не занятая заголовком, рамкой и меню (если они есть у формы). При использовании объекта Graphics из класса PaintEventArgs вы не можете рисовать за пределами клиентской области. Значит, можно не беспокоиться, что вы нарисуете что-нибудь не там, где предполагалось.
Координаты точки, передаваемые методу DrawString, указывают положение левого верхнего угла первого символа строки. При указании координат (0, 0) строка текста показывается в левом верхнем углу клиентской области.
Теперь применим полученные знания в программе PaintHello.
PaintHello.cs
//--------------------------------------------- // PaintHello.cs (C) 2001 by Charles Petzold //--------------------------------------------- using System; using System.Drawing; using System.Windows.Forms; class PaintHello { public static void Main() { Form form = new Form(); form.Text = "Paint Hello"; form.BackColor = Color.White; form.Paint += new PaintEventHandler(MyPaintHandler); Application.Run(form); } static void MyPaintHandler(object objSender, PaintEventArgs pea) { Form form = (Form)objSender; Graphics grfx = pea.Graphics; grfx.DrawString("Hello world!", form.Font, Brushes.Black, 0, 0); } }
Итак, мы получили первую и, как можно видеть, не такую уж простую программу, показывающую текст в форме. Текст выводится в левом верхнем углу клиентской области:
1 Drawstring — шнурок, затягивающий сумку, мешок. — Прим. перев.
2 Факсимиле и перевод на английский труда Декарта по аналитической геометрии (1637 г.) см. в книге The Geometry of Rene Descartes (New York: Dover, 1954).
3 Исключение составляет OS/2 Presentation Manager, в котором координата увеличивалась снизу вверх. Это отлично подходило для программирования графики, но в других случаях не всегда было удобно. Программистам приходилось использовать координаты, растущие снизу вверх, например, при указании положения элементов управления в диалоговых окнах. Это приводило к тому, что диалоговые окна разрабатывались снизу вверх. Подробнее см.: Charles Petzold, Programming the OS/2 Presentation Manager (Redmond, WA: Microsoft Press, 1989) или Charles Petzold, OS/2 Presentation Manager Programming (Emeryville, CA: Ziff-Davis Press, 1994).
netlib.narod.ru | < Назад | Оглавление | Далее > |