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

Класс PictureBox

PictureBox — еще один класс элементов управления, связанный с изображениями. Он происходит от класса Control (и, следовательно, может обрабатывать ввод с клавиатуры и мыши), но редко когда выполняет что-либо, кроме вывода изображения. Вот его самые важные свойства:


Свойства PictureBox (выборочно)



Тип Свойство Доступ

Image Image Чтение/запись
BorderStyle BorderStyle Чтение/запись
PictureBoxSizeMode SizeMode Чтение/запись


Рамкой вокруг изображения управляют элементы перечисления BorderStyle:


Перечисление BorderStyle



Член Значение

None 0
FixedSingle 1
Fixed3D 2


Значение по умолчанию — None. Перечисление PictureBoxSizeMode определяет способы отображения изображений на элементах управления:


Перечисление PictureBoxSizeMode



Член Значение

Normal 0
StretchImage 1
AutoSize 2
CenterImage 3


Значение по умолчанию — Normal. Как и в случае с другими элементами управления, указать расположение PictureBox относительно родительского элемента позволяет свойство Location, а задать ширину и высоту — свойство Size. Если задать свойству SizeMode значение PictureBoxSizeMode.Normal или PictureBoxSizeMode.CenterImage, изображение будет выводиться в графическом окне в пиксельном (не метрическом) размере.

При значении PictureBoxSizeMode.Normal картинка выравнивается по верхнему левому краю элемента управления. Если размер элемента управления больше пиксельного размера изображения, справа и снизу от последнего вы увидите фоновый цвет (BackColor) элемента управления. Если элемент управления меньше изображения, правая и нижняя части изображения будут скрыты.

При значении PictureBoxSizeMode.CenterImage изображение размещается по центру элемента управления. И все же оно по-прежнему выводится в пиксельном размере и в зависимости от размеров картинки может отображаться частично или с рамкой цвета фона элемента управления.

Если задать свойству ClientSize элемента управления PictureBox значение свойства Size объекта Image, размеры элемента управления будут точно соответствовать размеру изображения (свойство ClientSize элемента управления определяет размер в пределах рамки). Кроме того, можно задать свойству SizeMode значение PictureBoxSizeMode.AutoSize и привязать размер элемента управления к размеру объекта Image.

При значении PictureBoxSizeMode.StretchImage картинка увеличивается до размеров элемента управления. Однако в случае несовпадения форматов изображения и элемента управления изображение искажается.

А где же элемент перечисления PictureBoxSizeMode, масштабирующий изображение изотропно? Увы, такого нет. Я устранил этот недостаток при помощи элемента управления PictureBoxPlus, который переопределяет элемент управления PictureBox и имеет дополнительное свойство NoDistort.

PictureBoxPlus.cs

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

  namespace Petzold.ProgrammingWindowsWithCSharp
  {
      class PictureBoxPlus: PictureBox
      {
          bool bNoDistort = false;

          public bool NoDistort
          {
              get { return bNoDistort; }
              set
              {
                  bNoDistort = value;
                  Invalidate();
              }
          }
          protected override void OnPaint(PaintEventArgs pea)
          {
              if ((Image !=  null) && NoDistort &&
                      (SizeMode == PictureBoxSizeMode.StretchImage))
                  ScaleImageIsotropically(pea.Graphics, Image, ClientRectangle);
              else
                  base.OnPaint(pea);
          }
          void ScaleImageIsotropically(Graphics grfx, Image image, Rectangle rect)
          {
              SizeF sizef = new SizeF(image.Width  / image.HorizontalResolution,
                                      image.Height / image.VerticalResolution);

              float fScale = Math.Min(rect.Width  / sizef.Width,
                                      rect.Height / sizef.Height);

              sizef.Width  *= fScale;
              sizef.Height *= fScale;

              grfx.DrawImage(image, rect.X + (rect.Width  - sizef.Width ) / 2,
                                    rect.Y + (rect.Height - sizef.Height) / 2,
                                    sizef.Width, sizef.Height);
          }
      }
  }

Данный элемент управления выводит изображение методом ScaleImageIsotropicaily, только если значение свойства SizeMode — PictureBoxSizeMode.StretchImage и значение свойства NoDistort — true. В противном случае элемент управления вызывает метод OnPaint базового класса.

Следующая программа тестирует элемент управления PictureBoxPlus при помощи его свойства Dock, растягивая элемент управления на всю клиентскую область формы. По функциональности эта программа аналогична ImageScaleIsotropic.

PictureBoxPlusDemo.cs

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

  class PictureBoxPlusDemo: Form
  {
      public static void Main()
      {
          Application.Run(new PictureBoxPlusDemo());
      }
      public PictureBoxPlusDemo()
      {
          Text = "PictureBoxPlus Demo";

          PictureBoxPlus picbox = new PictureBoxPlus();
          picbox.Parent = this;
          picbox.Dock = DockStyle.Fill;
          picbox.Image = Image.FromFile("..\\..\\..\\Apollo11FullColor.jpg");
          picbox.SizeMode = PictureBoxSizeMode.StretchImage;
          picbox.NoDistort = true;
      }
  }

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

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