| 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 | < Назад | Оглавление | Далее > |