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

Класс 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 не ограничиваются предоставлением методов рисования, таких как 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 миллиметр для второго эллипса.

Illustration that shows two ellipses: rotation and pen width.

Отсеченная область

Объект 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);  

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

Diagram that shows the limited clip region.

См. также