Поделиться через


Управление состоянием объекта Graphics

Обновлен: Ноябрь 2007

Класс Graphics является ключевым элементом интерфейса GDI+. Чтобы нарисовать что-либо, необходимо получить объект Graphics, задать его свойства и вызвать его методы (DrawLine, DrawImage, DrawString и т. д.).

В данном примере вызывается метод DrawRectangle класса Graphics. Первым параметром, передаваемым методу DrawRectangle, является объект Pen.

Dim graphics As Graphics = e.Graphics
Dim pen As New Pen(Color.Blue) ' Opaque blue
graphics.DrawRectangle(pen, 10, 10, 200, 100)
Graphics graphics = e.Graphics;
Pen pen = new Pen(Color.Blue);  // Opaque blue
graphics.DrawRectangle(pen, 10, 10, 200, 100);

Состояние объекта Graphics

Объект Graphics предоставляет более широкие функции, чем функции рисования, такие как DrawLine или DrawRectangle. Объект Graphics также осуществляет поддержку графического состояния, которое можно подразделить на следующие категории:

  • Параметры качества

  • Преобразования

  • Область обрезки

Параметры качества

Объект Graphics содержит некоторые свойства, влияющие на качество отображаемых объектов. Например, можно установить значение свойства TextRenderingHint, чтобы указать способ сглаживания (если оно нужно), применяемый к тексту. К другим свойствам, влияющим на качество, относятся свойства SmoothingMode, CompositingMode, CompositingQuality и InterpolationMode.

В следующем примере рисуются два эллипса, один с режимом сглаживания AntiAlias, а второй — с режимом сглаживания HighSpeed:

Dim graphics As Graphics = e.Graphics
Dim pen As New Pen(Color.Blue)
      
graphics.SmoothingMode = SmoothingMode.AntiAlias
graphics.DrawEllipse(pen, 0, 0, 200, 100)
graphics.SmoothingMode = SmoothingMode.HighSpeed
graphics.DrawEllipse(pen, 0, 150, 200, 100)
Graphics graphics = e.Graphics;
Pen pen = new Pen(Color.Blue);

graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.DrawEllipse(pen, 0, 0, 200, 100);
graphics.SmoothingMode = SmoothingMode.HighSpeed;
graphics.DrawEllipse(pen, 0, 150, 200, 100);

Преобразования

Объект Graphics поддерживает два преобразования (объемное и страничное), которые применяются ко всем объектам, отображаемым объектом Graphics. Любое аффинное преобразование можно хранить в объемном преобразовании. Аффинные преобразования — это масштабирование, поворот, отражение, наклон и сдвиг. Страничное преобразование может использоваться для масштабирования и преобразования единиц измерения (например точек в дюймы). Дополнительные сведения см. в разделе Системы координат и преобразования.

В приведенном ниже примере устанавливаются объемное и страничное преобразования объекта Graphics. В качестве объемного преобразования устанавливается поворот на 30 градусов. Страничное преобразование устанавливается таким образом, чтобы координаты, передаваемые второму методу DrawEllipse, измерялись в миллиметрах, а не в точках. В коде осуществляются два одинаковых вызова метода DrawEllipse. При вызове первого метода DrawEllipse применяется только объемное преобразование, а при вызове второго метода DrawEllipse применяются оба преобразования (объемное и страничное).

Dim graphics As Graphics = e.Graphics
Dim pen As New Pen(Color.Red)
      
graphics.ResetTransform()
graphics.RotateTransform(30) ' world transformation
graphics.DrawEllipse(pen, 0, 0, 100, 50)
graphics.PageUnit = GraphicsUnit.Millimeter ' page transformation
graphics.DrawEllipse(pen, 0, 0, 100, 50)
Graphics graphics = e.Graphics;
Pen pen = new Pen(Color.Red); 

graphics.ResetTransform();
graphics.RotateTransform(30);                    // world transformation
graphics.DrawEllipse(pen, 0, 0, 100, 50);
graphics.PageUnit = GraphicsUnit.Millimeter;     // page transformation
graphics.DrawEllipse(pen, 0, 0, 100, 50);

Два нарисованных эллипса показаны на следующем рисунке. Следует отметить, что поворот на 30 градусов осуществляется относительно начала координат (верхний левый угол клиентской области), а не относительно центров эллипсов. Также обратите внимание, что толщина пера, равная 1, означает 1 точку при рисовании первого эллипса, а при рисовании второго эллипса это 1 миллиметр.

Овалы

Область обрезки

Объект Graphics поддерживает область обрезки, которая применяется для всех объектов, отображаемых объектом Graphics. Для установки границ области обрезки служит метод SetClip.

В следующем примере создается область в форме креста, являющаяся объединением двух прямоугольников. Эта область назначается областью обрезки для объекта Graphics. Затем в коде рисуются две линии, ограниченные внутренней частью области обрезки.

Dim graphics As Graphics = e.Graphics
      
' Opaque red, width 5
Dim pen As New Pen(Color.Red, 5)
      
' Opaque aqua
Dim brush As New SolidBrush(Color.FromArgb(255, 180, 255, 255))
      
' Create a plus-shaped region by forming the union of two rectangles.
Dim [region] As New [Region](New Rectangle(50, 0, 50, 150))
[region].Union(New Rectangle(0, 50, 150, 50))
graphics.FillRegion(brush, [region])
      
' Set the clipping region.
graphics.SetClip([region], CombineMode.Replace)
      
' Draw two clipped lines.
graphics.DrawLine(pen, 0, 30, 150, 160)
graphics.DrawLine(pen, 40, 20, 190, 150)
Graphics graphics = e.Graphics;

// Opaque red, width 5
Pen pen = new Pen(Color.Red, 5);  

// Opaque aqua
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 180, 255, 255));  

// Create a plus-shaped region by forming the union of two rectangles.
Region region = new Region(new Rectangle(50, 0, 50, 150));
region.Union(new Rectangle(0, 50, 150, 50));
graphics.FillRegion(brush, region);

// Set the clipping region.
graphics.SetClip(region, CombineMode.Replace);

// Draw two clipped lines.
graphics.DrawLine(pen, 0, 30, 150, 160);
graphics.DrawLine(pen, 40, 20, 190, 150);

Обрезанные линии показаны на следующем рисунке.

Ограниченная область обрезки

См. также

Основные понятия

Использование вложенных графических контейнеров

Другие ресурсы

Объекты Graphics и Drawing в Windows Forms