Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Gdi
Gdi
GDI+
Introduccin a GDI+
En este captulo se introduce la programacin grfica utilizando las clases del Graphics
Device Interface (GDI+). GDI+ es la evolucin de GDI, que resultaba compleja de
utilizar. En Visual Studio .NET, se puede decir que Microsoft ha cuidado, simplificado
y mejorado la manera de trabajar con objetos grficos.
El namespace System.Drawing proporciona acceso a la funcionalidad bsica del GDI+.
Adems, se proporcionan otras clases y estructuras en los namespace System.Text,
System.Printing, System.Imaging, System.Drawing2D y System.Design.
El namespace System.Drawing
Las clases y estructuras ms importantes del namespace System.Drawing son:
Clases
Bitmap
Brush y Brushes
Font
FontFamily
Graphics
Icon
Image
Pen y Pens
Region
SolidBrush
Estructuras
Color
Point y PointF
Rectangle y RectangleF
Size y SizeF
Color ARGB.
Para trabajar con puntos en el plano.
Para trabajar con rectngulos.
Para trabajar con las dimensiones de una figura.
Enumeraciones
ContentAlignment
1/16
FontStyle
GraphicsUnit
GDI+
b) Si se desea utilizar otro evento por ejemplo, si se quiere dibujar al pulsar un botn
del formulario- no resulta lgico esperar a que se produzca el evento Paint. En estas
situaciones, se puede obtener el objeto Graphics invocando al mtodo
CreateGraphics() del formulario. En este ltimo caso cuando lo obtiene el
programador directamente a travs de CreateGraphics()- es muy importante invocar
al mtodo Dispose() al final del mtodo, para liberar esos recursos, ya que el Garbage
Collector no lo har por defecto en este caso. No es necesario hacerlo cuando se obtiene
a travs de la propiedad Graphics:
private void formulario_Click(object sender, EventArgs e)
{
Graphics g = this.CreateGraphics();
//cdigo
g.Dispose();
//Muy importante liberar recursos
2/16
GDI+
Mtodos
Una vez que se tiene la referencia del objeto Graphics se puede invocar cualquier
miembro de la clase Graphics para dibujar objetos. Los mtodos ms importantes de
esta clase son:
DrawArc
DrawBezier
DrawCurve
DrawEllipse
DrawLine
DrawPolygon
DrawRectangle
FillEllipse
FillPolygon
FillRectangle
FillRectangles
FillRegion
Dibuja un arco.
Dibuja una curva de Bezier.
Dibuja una curva definida por un array de puntos.
Dibuja una elipse.
Dibuja una lnea recta.
Dibuja un polgono.
Dibuja un rectngulo.
Rellena el interior de una elipse.
Rellena el interior de un polgono definido por un array de puntos.
Rellena el interior de un rectngulo con un determinado Brush.
Rellena el interior de una serie de rectngulos con un determinado
Brush.
Rellena el interior de una regin.
Esta clase posee ms mtodos para dibujar. Aqu se han sealado los ms importantes.
Adems, tiene mtodos muy tiles para trabajar con imgenes e iconos -posteriormente
se estudiarn ambas clases-:
Los mtodos ms importantes en este sentido son:
DrawIcon
DrawIconUnstretched
DrawImage
DrawImageUnscaled
DrawString
RotateTransform
ScaleTransform
TranslateTransform
Dibuja un icono
Dibuja un icono con su tamao original en una
determinada posicin.
Sita una imagen en la pantalla
Dibuja una imagen con su tamao original y en un
determinado lugar.
Escribe texto
Gira la imagen un angulo especificado
Aplica una escala a la imagen
Desplaza la imagen
3/16
GDI+
Otro ejemplo lo constituye el mtodo DrawImage. Los parmetros son muy elocuentes
de la funcin que realizan y por eso no se explicarn aqu:
public
public
public
public
public
alto);
void
void
void
void
void
Con los dems mtodos sucede algo similar. Sera muy extenso definir aqu todas las
definiciones de todos los mtodos.
Otros tres mtodos de inters son:
Graphics FromImage(Image unaImagen) Crea un Nuevo objeto Graphics a partir del
objeto Image especificado.
void Clear(Color unColor)
Rellena la superficie con el color de fondo.
void Dispose()
Antes de comenzar a dibujar nada, es preciso definir el estilo del trabajo es decir,
especificar el color, la anchura y tipo, etc de las lneas del grfico-, utilizando las
estructuras definidas en este namespace. Los principales son Brush, Pen, Font y
Color.
La clase Pen
La clase System.Drawing.Pen sirve para especificar el ancho y el estilo de la lnea de
dibujo o de la figura geomtrica. No slo indica el color del trazado sino el tipo a
rayas, puntos, contnua...-.
Los constructores de la clase Pen son:
public Pen(Color colorDeLinea);
public Pen(Brush brocha);
public Pen(Brush brocha, float anchoDeLinea);
4/16
GDI+
Por ejemplo:
Pen unLapiz = new Pen( Color.Orange );
Pen
Pen tiene otras propiedades y mtodos para definir el estilo de la lnea a puntos,
contnua, etc- o para rotar, trasladar o escalar una imagen o figura, como por ejemplo:
public void RotateTransform(float angulo);
public void TranslateTransform(float dx, float dy);
public void ScaleTransform(float sx, float sy);
Por ejemplo:
// Crea un objeto Pen
Pen lapiz = new Pen(Color.Black, 5);
// Dibuja un rectangulo con el Pen lapiz
e.Graphics.DrawRectangle(lapiz, 10, 10, 100, 100);
// Escala el lapiz en la direccion X
lapiz.ScaleTransform(2, 1);
// Rota 90 grados
lapiz.RotateTransform(90);
// Dibuja un segundo rectangulo con lapiz
e.Graphics.DrawRectangle(lapiz, 120, 10, 100, 100);
La clase Brush
Esta clase proporciona funcionalidad para rellenar una determinada regin o figura con
el color slido color, textura, etc- que se indique. La clase System.Drawing.Brush es
una clase base abstracta y no puede ser instanciada, es decir, no se pueden crear objetos
5/16
GDI+
de esta clase. Para crear un objeto Brush se debe utilizar alguna de sus clases derivadas
como SolidBrush, TextureBrush o LinearGradientBrush.
Por ejemplo:
Brush colorSolidoBeige = new SolidBrush(Color.Beige);
Brush colorNaranjaMarron = new SolidBrush(Color.FromArgb(255,150,0));
La clase Font
Esta clase permite trabajar y definir las caractersticas tipo, tamao, color, estilo, etcde letra en el objeto Graphics.
Los constructores ms importantes son:
public Font(FontFamily familia, float tamao);
public Font(FontFamily familia, float tamao, FontStyle estilo);
public Font(string tipoDeLetra, float tamao);
public Font(string tipoDeLetra, float tamao, FontStyle estilo);
public Font(Font fuente, FontStyle estilo);
Texto en negrita.
Italic
Texto en cursiva.
Regular
Texto Normal.
Strikeout
Texto tachado.
Underline
Texto subrayado
6/16
GDI+
Por ejemplo:
Font unaFuente = new Font(Verdana, 22);
Font otraFuente = new Font(Courier, 12);
Si se desea que la letra asigne varios de los estilos, basta con sumar el estilo de la
letra, utilizando el operador |.
Font segundaFuente = new Font(Georgia, 22, Bold | Italic);
Bold
FontFamily
Height
Italic
Name
Size
SizeInPoints
Strikeout
Style
Underline
Unit
Ejemplo:
protected override OnPaint(PaintEventArgs e)
{
Graphics dc = e.Graphics;
Brush brochaAzul = Brushes.Blue;
Brush brochaNegra = Brushes.Black;
Font unaFuente = new Font(Verdana, 22);
Font otraFuente = new Font(Times New Roman, FontStyle.Italic |
FontStyle.Underline);
dc.DrawString(Una frase, unaFuente, brochaAzul, 10,100);
// Ms codigo
base.OnPaint(e);
}
Para
obtener
todas
las
7/16
GDI+
{
//codigo
}
La estructura Color
La estructura Color est representada por un color ARGB (Alpha, Red, Green, Blue). Las
propiedades son:
byte
byte
byte
byte
A
B
G
R
Casi todos los miembros de la estructura Color son estticos y no es necesario crear un
objeto de esta clase para trabajar con color determinado. Esta clase tiene un importante
mtodo esttico sobrecargado denominado FromArgb, que define un objeto color. Este
mtodo est sobrecargado:
public
public
public
azul);
public
Color
FromArgb(int
argb);
0,
0);
Esta clase define una serie de constantes que corresponden a los colores ms comunes.
Son propiedades estticas y pblicas de slo lectura que devuelven un objeto de tipo
Color con el color especificado.
Por eso, es lo mismo:
this.BackColor = Color.White;
que:
this.BackColor = Color.FromArgb(255,255,255);
8/16
GDI+
La estructura Point
Esta estructura tiene dos propiedades que representan las coordenadas X e Y del punto a
partir del origen. X e Y, por defecto, se representan en pixeles. Este tipo tambin tiene un
mtodo muy til que es:
void Offset(int dx, int dy), que traslada el punto en una cantidad
dada.
Por ejemplo:
Point p1 = new Point( 30, 30);
Point p2 = new Point( 130, 250);
Point p3 = new Point( 0, 0);
p3.X = 15;
p3.Y = 45;
p1.Offset(100,100);
System.Console.WriteLine(p1 = {0},p1);
System.Console.WriteLine(p2 = {0},p2);
System.Console.WriteLine(p3 = {0},p3);
PointF es una estructura muy similar a Point, excepto que X e Y son de tipo float.
La estructura Rectangle
Esta estructura permite construir objetos que representan una regin rectangular. Como
sucede en la estructura Point, tambin se define la estructura RectangleF, que es
idntica a sta pero que sus coordenadas son de tipo float.
Los constructores de esta clase son:
public Rectangle(Point esquinaSupIzda, Size tamao);
public Rectangle(int x, int y, int ancho, int alto);
9/16
int Width
Point Location
Size Size
bool IsEmpty()
GDI+
izquierda
del
Por ejemplo:
Rectangle r = new Rectangle(0, 0, 150, 200);
Point p = new Point(50, 50);
if(r.Contains(p))
System.Console.WriteLine(p est en el interior de r);
else
System.Console.WriteLine(p est fuera de r);
La clase Size
Las estructuras Size y SizeF son muy parecidas a Point y PointF.
Size tiene dos campos enteros SizeF dos float- que representan una distancia
horizontal y otra vertical, llamados Width y Height respectivamente.
Aunque las estructuras son muy parecidas, Point se utiliza para indicar donde est algo
y Size para definir su tamao.
Por ejemplo:
Point punto=new Point(21,78);
Size tamao=new Size(40,50),
Rectangle r=new Rectangulo(punto,tamao);
La clase Image
En C# es relativamente sencillo manipular imgenes, cambiando sus tamaos,
rotndolas, cortndolas, etc. La funcionalidad la proporciona la clase abstracta
System.Drawing.Image. Una instancia de esta clase representa una imagen o un
dibujo. No tiene ningn constructor pblico. Sin embargo, tiene un mtodo, FromFile,
que devuelve un objeto de esta clase si se le pasa como argumento el nombre de un
fichero. Su estructura es:
public static Image FromFile(string unFichero);
Por ejemplo:
Image unaImagen = Image.FromFile(@c:\temporal\unaFotografia.jpg);
10/16
10
GDI+
Propiedades
int Height
Ejemplos
A continuacin se implementan dos ejemplos bsicos para ilustrar estas ideas.
En primer lugar se trata de un formulario que presenta el fichero grfico (Figura 19.1)
11/16
11
GDI+
12/16
12
GDI+
unaImagen.Dispose();
System;
System.Drawing;
System.Collections;
System.ComponentModel;
System.Windows.Forms;
System.Data;
namespace AplicacionGDIUno
{
public class Form1 : System.Windows.Forms.Form
{
private Image unaImagen;
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
unaImagen=Image.FromFile(@"c:\Muestra.jpg");
this.BackgroundImage=unaImagen;
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
unaImagen.Dispose();
}
#region Windows Form Designer generated code
private void InitializeComponent()
{
//
// Form1
//
this.AutoScaleBaseSize=new System.Drawing.Size(5,13);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Name = "Form1";
this.Text = "Form1";
this.Resize+=new System.EventHandler(Form1_Resize);
}
#endregion
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void Form1_Resize(object sender, EventArgs e)
{
13/16
13
GDI+
Graphics g=CreateGraphics();
Image unaImagen=Image.FromFile(@"c:\Muestra.jpg");
g.DrawImage(unaImagen,0,0,
this.Size.Width,this.Size.Height);
g.Dispose();
}
}
}
Dje las etiquetas con la propiedad Name que tienen por defecto, pero cambie en
todas ellas las propiedad Autosize a true y pnga su propiedad Text con los textos
que se indican en la figura 19.2.
14/16
14
GDI+
y asigne las siguientes propiedades Name a cada una de ellas: txtX, txtY, txtAncho
y txtAlto.
Aada ahora un botn cuya propiedad Name sea btnDibujar y la propiedad Text
Dibujar y aada el siguiente cdigo al evento Click:
private void btnDibujar_Click(object sender, System.EventArgs e)
{
//obtiene el objeto Graohics
Graphics g=CreateGraphics();
//Obtiene las dimensiones del rectangulo
int x=int.Parse(txtX.Text);
int y=int.Parse(txtY.Text);
int ancho=int.Parse(txtAncho.Text);
int alto=int.Parse(txtAlto.Text);
Rectangle r=new Rectangle(x,y,ancho,alto);
//Define una brocha
Brush brocha=Brushes.Yellow;
//Dibuja el rectngulo
g.FillRectangle(brocha,r);
//libera los recursos
g.Dispose();
}
En este ejemplo se puede apreciar bien la funcionalidad del evento Paint. Este evento
se produce siempre que se tenga que dibujar el formulario. Por eso, al principio se
dibuja una elipse en este caso una circunferencia- de las dimensiones especificadas.
Aunque se cambien las dimensiones, no se vuelve a dibujar. Para hacerlo, es necesario
que se minimice el formulario y se vuelva a su tamao original o bien que se pase con
15/16
15
GDI+
otra ventana de otro programa por encima del formulario y entonces, necesitar
redibujarse.
Sin embargo, cuando se pulsa el botn se dibuja el rectngulo con las dimensiones
indicadas. Cada vez que se pulsa el botn, no se refresca la pantalla y se dibuyja el
rectngulo superpuesto al anterior. Para evitar esto, es necesario que se ejecute de nuevo
el mtodo OnPaint.
16/16
16