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


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

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

Иллюстрация, показывающая два эллипса: вращение и ширина пера.

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

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

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

диаграмма, показывающая ограниченную область клипа.

См. также