netlib.narod.ru | < Назад | Оглавление | Далее > |
Перо какой толщины подходит для принтера? Намек на ответ дает PostScript — широко известный и весьма уважаемый язык описания страниц, применяемый в большинстве профессиональных принтеров. Можно считать, что толщина обычного пера по умолчанию — 1 пункт (иначе 1/72 дюйма, или 1/3 мм). Лично я не считаю этот пример самым изящным, зато его легко запомнить.
Вот программа, которая выводит несколько перьев с разной толщиной, выраженной в пунктах.
PenWidths.cs
//------------------------------------------ // PenWidths.cs (C) 2001 by Charles Petzold //------------------------------------------ using System; using System.Drawing; using System.Windows.Forms; class PenWidths: PrintableForm { public new static void Main() { Application.Run(new PenWidths()); } public PenWidths() { Text = "Pen Widths"; } protected override void DoPage(Graphics grfx, Color clr, int cx, int cy) { Brush brush = new SolidBrush(clr); float y = 0; grfx.PageUnit = GraphicsUnit.Point; grfx.PageScale = 1; for (float f = 0; f < 3.2; f += 0.2f) { Pen pen = new Pen(clr, f); string str = String.Format("{0:F1}-point-wide pen: ", f); SizeF sizef = grfx.MeasureString(str, Font); grfx.DrawString(str, Font, brush, 0, y); grfx.DrawLine(pen, sizef.Width, y + sizef.Height / 2, sizef.Width + 144, y + sizef.Height / 2); y += sizef.Height; } } }
Хотя число пикселов толщины пера можно задать дробным числом, перо визуализируется лишь целым числом пикселов, При выводе на экран толщина большинства перьев, созданных этой программой, округляется до соответствующих значений:
Можно не беспокоиться, что при выводе на экран толщина пера будет округлена до 0 и перо исчезнет. Перья всегда рисуются толщиной минимум 1 пиксел. Действительно, если установить в конструкторе Pen толщину пера 0, то независимо от значений свойств PageUnit и PageScale все линии будут нарисованы толщиной в 1 пиксел.
Хотя перья с толщиной 0 прекрасно подходят для дисплея, никогда не используйте их для принтера. На современном лазерном принтере, печатающем с высоким разрешением, линия толщиной в 1 пиксел будет практически невидимой.
Вот программа для рисования шестидюймовой линейки с делениями, использующая единицы измерения 1/64 дюйма и создающая перо толщиной 1/128 дюйма.
SixInchRuler.cs
//--------------------------------------------- // SixInchRuler.cs (C) 2001 by Charles Petzold //--------------------------------------------- using System; using System.Drawing; using System.Windows.Forms; class SixInchRuler: PrintableForm { public new static void Main() { Application.Run(new SixInchRuler()); } public SixInchRuler() { Text = "Six-Inch Ruler"; } protected override void DoPage(Graphics grfx, Color clr, int cx, int cy) { Brush brush = new SolidBrush(clr); Pen pen = new Pen(clr, 0.5f); const int xOffset = 16; const int yOffset = 16; grfx.PageUnit = GraphicsUnit.Inch; grfx.PageScale = 1 / 64f; grfx.DrawRectangle(pen, xOffset, yOffset, 6 * 64, 64); StringFormat strfmt = new StringFormat(); strfmt.Alignment = StringAlignment.Center; for (int i = 1; i < 6 * 16; i++) { int x = xOffset + i * 4; int y = yOffset; int dy; if (i % 16 == 0) // Дюймовые деления { dy = 32; grfx.DrawString((i / 16).ToString(), Font, brush, x, y + dy, strfmt); } else if (i % 8 == 0) // Полудюймовые деления dy = 24; else if (i % 4 == 0) // Деления для 1/4 дюйма dy = 20; else if (i % 2 == 0) // Деления для 1/8 дюйма dy = 16; else // Деления для 1/16 дюйма dy = 12; grfx.DrawLine(pen, x, y, x, y + dy); } } }
Программа рисует такую линейку:
Возможно, вы заметили, что ни одно из значений PageUnit и PageScale, по-видимому не влияет на текст. Дело в том, что кегль шрифта, доступного через свойство Font формы, составляет около 8 пунктов и не меняется. В главе 9 я покажу, как создать шрифт, размер которого зависит от значений свойств PageUnit и PageScale.
netlib.narod.ru | < Назад | Оглавление | Далее > |