Estado de un objeto Graphics
La clase Graphics es la esencia de GDI+. Para dibujar algo, hay que obtener un objeto Graphics, establecer sus propiedades y después llamar a los métodos de éste (DrawLine, DrawImage, DrawString y similares).
En el siguiente ejemplo se llama al método DrawRectangle de un objeto Graphics. El primer argumento pasado al método DrawRectangle es un objeto Pen.
Dim graphics As Graphics = e.Graphics
Dim pen As New Pen(Color.Blue) ' Opaque blue
graphics.DrawRectangle(pen, 10, 10, 200, 100)
[C#]
Graphics graphics = e.Graphics;
Pen pen = new Pen(Color.Blue); // Opaque blue
graphics.DrawRectangle(pen, 10, 10, 200, 100);
Estado de los gráficos
Los objetos Graphics no se limitan únicamente a proporcionar métodos de dibujo, como DrawLine y DrawRectangle. También mantienen el estado de los gráficos, que se puede dividir en las siguientes categorías:
- Valores de calidad
- Transformaciones
- Región de recorte
Valores de calidad
Los objetos Graphics poseen varias propiedades que afectan a la calidad de los elementos que se dibujan. Por ejemplo, se puede definir la propiedad TextRenderingHint para que especifique el tipo de alisado (de haberlo) aplicado al texto. Otras propiedades que influyen sobre a la calidad son SmoothingMode, CompositingMode, CompositingQuality e InterpolationMode.
En el siguiente ejemplo se dibujan dos elipses, una con el modo de suavizado establecido en AntiAlias y la 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)
[C#]
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
Los objetos Graphics mantienen dos transformaciones (universal y de página) que se aplican a todos los elementos que dibuja el objeto Graphics en cuestión. Las transformaciones afines se pueden almacenar en la transformación universal. Las transformaciones afines incluyen el ajuste de escala, rotación, reflejo, inclinación y conversión. La transformación de página se puede utilizar para ajustar la escala y para modificar unidades (por ejemplo, de píxeles a pulgadas). Para obtener más información, vea Sistemas de coordenadas y transformaciones.
En el siguiente ejemplo se establecen las transformaciones universal y de página de un objeto Graphics. La transformación universal se establece en una rotación de 30 grados. La transformación de página se establece de modo que las coordenadas pasadas al segundo método DrawEllipse sean tratadas como milímetros en lugar de píxeles. El código hace dos llamadas iguales al método DrawEllipse. La transformación universal se aplica a la primera llamada a DrawEllipse, mientras que a la segunda llamada a DrawEllipse se aplican las dos transformaciones (universal y de página).
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)
[C#]
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 siguiente ilustración se muestran las dos elipses. Observe que la rotación de 30 grados se sitúa alrededor del origen del sistema de coordenadas (esquina superior izquierda del área del cliente), y no en los centros de las elipses. Observe asimismo que el ancho del lápiz 1 significa 1 píxel para la primera elipse y 1 milímetro para la segunda.
Región de recorte
Los objetos Graphics mantienen una región de recorte que se aplica a todos los elementos que dibuje cada objeto Graphics. Para establecer la región de recorte, llame al método SetClip.
En el siguiente ejemplo se crea una región con forma de signo más mediante la unión de dos rectángulos. Dicha región se designa como la región de recorte de un objeto Graphics. Luego, el código dibuja dos líneas que se limitan 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)
[C#]
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 siguiente ilustración se muestran las líneas recortadas.