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

Hello World с растровым изображением

Следующая программа создает битовую карту и рисует на ней вечную мантру программиста высотой в 72 пункта. Затем битовая карта выводится в клиентской области и (не обязательно) на странице принтера.

HelloWorldBitmap.cs

  //-------------------------------------------------
  // HelloWorldBitmap.cs (C) 2001 by Charles Petzold
  //-------------------------------------------------
  using System;
  using System.Drawing;
  using System.Windows.Forms;

  class HelloWorldBitmap: PrintableForm
  {
      const  float fResolution = 300;
      Bitmap bitmap;

      public new static void Main()
      {
          Application.Run(new HelloWorldBitmap());
      }
      public HelloWorldBitmap()
      {
          Text = "Hello, World!";

          bitmap = new Bitmap(1, 1);
          bitmap.SetResolution(fResolution, fResolution);

          Graphics grfx = Graphics.FromImage(bitmap);
          Font     font = new Font("Times New Roman", 72);
          Size     size = grfx.MeasureString(Text, font).ToSize();

          bitmap = new Bitmap(bitmap, size);
          bitmap.SetResolution(fResolution, fResolution);

          grfx = Graphics.FromImage(bitmap);
          grfx.Clear(Color.White);
          grfx.DrawString(Text, font, Brushes.Black, 0, 0);
          grfx.Dispose();
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          grfx.DrawImage(bitmap, 0, 0);
      }
  }

Битовая карта создается в конструкторе программы, и, как видите, код довольно запутан. Проблема такова: я хотел, чтобы битовая карта по размеру точно соответствовала выводимой строке, но не хотел использовать разрешение битовой карты, связанное с реальным устройством вывода. Проблема ясна? Чтобы получить размеры строки текста, нужен метод MeasureString объекта Graphics. Однако чтобы объект Graphics основывался на битовой карте с произвольным разрешением устройства, для его получения нужен объект Bitmap или Image!

В связи с этим конструктор создает две карты. Первая очень маленькая — квадрат со стороной 1 пиксел, но этого вполне хватает. Программа с помощью константы fResolution назначает этой битовой карте разрешение 300 dpi. Затем она получает объект Graphics, создает шрифт Times New Roman высотой 72 пункта и вызывает MeasureString.

Для создания новой битовой карты используются размеры, возвращаемые методом MeasureString. Эта карта также должна иметь разрешение 300 dpi. После этого программа получает объект Graphics для новой карты, изменяет цвет фона на белый и выводит текст черным шрифтом.

Программа выводит битовую карту на дисплей и принтер методом DrawImage. Итоговое изображение выглядит как обычный текст высотой 72 пункта. Однако настоящее доказательство того, что программа делает что-то интересное, — вывод на принтер: символы шрифта отображаются такими же ровными и неискаженными, как и в случае с разрешением 300 dpi. Попробуйте уменьшить константу fResolution (скажем, до 30 dpi) и посмотрите, что получится на дисплее и принтере.


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

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