Compartir a través de


Administración del estado de un objeto gráfico

La Graphics clase está en el núcleo de GDI+. Para dibujar cualquier cosa, obtenga un objeto Graphics, establezca sus propiedades y llame a sus métodos DrawLine, DrawImage, DrawString, y similares.

El siguiente ejemplo llama al método DrawRectangle de un objeto Graphics. El primer argumento pasado al DrawRectangle método es un Pen objeto .

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);

Estado gráfico

Un Graphics objeto hace más de proporcionar métodos de dibujo, como DrawLine y DrawRectangle. Un Graphics objeto también mantiene el estado de los gráficos, que se puede dividir en las siguientes categorías:

  • Configuración de calidad

  • Transformaciones

  • Región de recorte

Configuración de calidad

Un Graphics objeto tiene varias propiedades que influyen en la calidad de los elementos que se dibujan. Por ejemplo, puede establecer la TextRenderingHint propiedad para especificar el tipo de suavizado (si hay alguno) aplicado al texto. Otras propiedades que influyen en la calidad son SmoothingMode, CompositingMode, CompositingQualityy InterpolationMode.

En el ejemplo siguiente se dibujan dos elipses, una con el modo de suavizado establecido en AntiAlias y otra con el modo de suavizado establecido en 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);

Transformaciones

Un Graphics objeto mantiene dos transformaciones (mundo y página) que se aplican a todos los elementos dibujados por ese Graphics objeto. Se puede almacenar cualquier transformación afín en la transformación mundial. Las transformaciones afines incluyen escalado, rotación, reflexión, deformación y traslación. La transformación de página se puede usar para el escalado y para cambiar unidades (por ejemplo, píxeles a pulgadas). Para obtener más información, vea Sistemas de coordenadas y transformaciones.

En el ejemplo siguiente se establecen las transformaciones de mundo y de página de un objeto Graphics. La transformación del mundo se establece en una rotación de 30 grados. La transformación de página se establece para que las coordenadas pasadas al segundo DrawEllipse se traten como milímetros en lugar de píxeles. El código realiza dos llamadas idénticas al DrawEllipse método . La transformación del mundo se aplica a la primera DrawEllipse llamada y ambas transformaciones (mundo y página) se aplican a la segunda DrawEllipse llamada.

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);

En la ilustración siguiente se muestran las dos elipses. Tenga en cuenta que la rotación de 30 grados es respecto al origen del sistema de coordenadas de origen (desde la esquina superior izquierda de la zona del cliente), no sobre los centros de las elipses. Tenga en cuenta también que el ancho del lápiz de 1 significa 1 píxel para la primera elipse y 1 milímetro para la segunda elipse.

Ilustración que muestra dos puntos suspensivos: rotación y ancho del lápiz.

Región de recorte

Un Graphics objeto mantiene una región de recorte que se aplica a todos los elementos dibujados por ese Graphics objeto. Puede establecer la región de recorte llamando al SetClip método .

En el ejemplo siguiente se crea una región con forma más mediante la formación de la unión de dos rectángulos. Esa región se designa como la región de recorte de un Graphics objeto. A continuación, el código dibuja dos líneas restringidas al interior de la región de recorte.

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);

En la ilustración siguiente se muestran las líneas recortadas:

Diagrama que muestra la región de recorte limitada.

Consulte también