Управление состоянием объекта 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);
Обрезанные линии показаны на следующем рисунке.
См. также
Основные понятия
Использование вложенных графических контейнеров