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;
          }
      }
  }

Хотя число пикселов толщины пера можно задать дробным числом, перо визуализируется лишь целым числом пикселов, При выводе на экран толщина большинства перьев, созданных этой программой, округляется до соответствующих значений:


Рис. 7.2.

Можно не беспокоиться, что при выводе на экран толщина пера будет округлена до 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);
          }
      }
  }

Программа рисует такую линейку:


Рис. 7.3.

Возможно, вы заметили, что ни одно из значений PageUnit и PageScale, по-видимому не влияет на текст. Дело в том, что кегль шрифта, доступного через свойство Font формы, составляет около 8 пунктов и не меняется. В главе 9 я покажу, как создать шрифт, размер которого зависит от значений свойств PageUnit и PageScale.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz