Está en la página 1de 16

Marco Besteiro y Miguel Rodrguez

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

Encapsula un bitmap GDI+ . Se utiliza para trabajar con


imgenes.
Se utilizan para rellenar reas cerradas con un
determinado patrn, color o bitmap.
Define el tipo de letra
Define una familia de tipos de letra con una similitud
bsica en el diseo y una cierta variacin en el estilo.
Encapsula la superficie grfica del GDI+.
Se utilizan para trabajar con iconos.
Clase base abstracta que proporciona funcionalidad para
las clases Bitmap, Icon y Metafile.
Para dibujar lneas, curvas, figuras, etc
Describe el interior de una superficie.
Define un objeto brush de color simple.

Color ARGB.
Para trabajar con puntos en el plano.
Para trabajar con rectngulos.
Para trabajar con las dimensiones de una figura.

Enumeraciones

ContentAlignment

Especifica el alineamiento del contenido de


una figura.

1/16

Marco Besteiro y Miguel Rodrguez

FontStyle
GraphicsUnit

GDI+

Estilo del texto.


Especifica la unidad de medida de los
datos.

Para trabajar con el GDI+ es imprescindible comprender la clase Graphics que


proporciona mtodos para dibujar en la pantalla, como Rectangle y Point. Por eso, se
estudiar en primer lugar. Posteriormente se explicarn las clases y estructuras ms
utilizadas y comunes del GDI+ como Pen, Brush, Rectangle, Point, etc.

Clases y estructuras del namespace System.Drawing


La clase Graphics
Graphics encapsula las superficies de dibujo de los formularios. Antes de dibujar
cualquier objeto grfico -un punto, una elipse o un rectgulo, etc- es necesario crear u
obtener el objeto Graphics de la superficie. En general, se utiliza el evento Paint del
formulario para obtener una referencia al objeto Graphics del formulario porque
cuando ocurre ese evento se le pasa como argumento al mtodo manejador un objeto de
la clase PaintEventArgs que tiene una propiedad que tambin se llama Graphics que
devuelve el objeto Graphics del formulario.
private void formulario_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
//cdigo
}

Otras formas de obtener el objeto Graphics son las siguientes:


a) Sobreescrir el mtodo OnPaint(), que es un mtodo virtual que la clase Form
hereda de la clase Control. Por ejemplo
protected override void OnPaint ( PaintEventArgs e)
{
Graphics g = e.Graphics;
}

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

Marco Besteiro y Miguel Rodrguez

GDI+

//cuando se utiliza este mtodo


}

c) El objeto Graphics se puede tambin obtener a travs de distintos mtodos estticos


de la clase System.Drawing.Graphics que aceptan como parmetro un fichero y
devuelven un objeto grfico.
Por ejemplo:
Graphics g = Graphics.FromFile(@c:\temporal\fichero.jpg);

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

Marco Besteiro y Miguel Rodrguez

GDI+

La gran mayora de ellos estn sobrecargados. Por ejemplo, considrese el mtodo


DrawIcon:

Para dibujar el icono unIcono en el rectngulo r.


public void DrawIcon(Icon unIcono, Rectangle r);

Para dibujar el icono unIcono en la posicin (x, y).


public void DrawIcon(Icon unIcono, int x, int y);

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

DrawImage(Image unaImagen, Point p);


DrawImage(Image unaImagen, Rectangle r);
DrawImage(Image unaImagen, int x, int y);
DrawImage(Image unaImagen, int ancho, int alto);
DrawImage(Image unaImagen, int x, int y, int ancho, int

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

Borra el objeto Graphics y libera la


memoria.

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

Marco Besteiro y Miguel Rodrguez

GDI+

public Pen(Color colorDeLinea, float anchoDeLinea);

Por ejemplo:
Pen unLapiz = new Pen( Color.Orange );
Pen

otroLapiz= new Pen( Color.Yellow, 30 );

Sin embargo, se puede utilizar la clase System.Drawing.Pens que no tiene constructor


pblico y se utiliza a travs de sus propiedades estticas que devuelven un objeto Pen de
la anchura de un pxel.
Por ejemplo:
Pen lapizSolidoAmarillo = Pens.Yellow;

Las propiedades ms importantes de la clase Pen son:


Brush
Color
Width

Define el brush (la brocha).


Define el color.
Define el ancho.

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

Marco Besteiro y Miguel Rodrguez

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

Tambin puede utilizarse la clase System.Drawing.Brused. No pueden crearse objetos


de esta clase porque no tiene un constructor pblico y se utiliza a travs de sus
propiedades estticas que devuelven un objeto Brush del color que se ha especificado.
Por ejemplo:
Brush solidoAzul = Brushes.Blue;
Brush solidoChocolate = Brused.Chocolate;

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

FontStyle es una enumeracin con los siguientes miembros:


Bold

Texto en negrita.

Italic

Texto en cursiva.

Regular

Texto Normal.

Strikeout

Texto tachado.

Underline

Texto subrayado

6/16

Marco Besteiro y Miguel Rodrguez

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

Las propiedades de Font ms importantes son:

Bold
FontFamily
Height
Italic
Name
Size
SizeInPoints
Strikeout
Style
Underline
Unit

Indica si la fuente es negrita.


Obtiene el FontFamily de esa fuente.
Obtiene la altura de la fuente.
Indica si la fuente es cursiva.
Nombre de la fuente.
Tamao de la fuente..
Tamao, en puntos, de la fuente.
Indica si la fuente est tachada.
Estilo de la fuente.
Indica si la fuente est subrayada.
Define la medida para la fuente actual.

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

fuentes del sistema, se puede utilizar la clase


InstalledFontCollection, del namespace System.Drawing.Text. Esta clase tiene
una propiedad, Familie, que devuelve un array con todas las fuentes disponibles del
sistema.
InstalledFontCollection fuentes = new InstalledFontCollection();
FontFamily[] familia = fuentes.Families;
foreach ( FontFamily f in familia)

7/16

Marco Besteiro y Miguel Rodrguez

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

valor del componente alpha del Color.


valor del componente azul (Blue) del Color.
valor del componente verde (Green) del Color.
valor del componente rojo (Red) del Color.

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

static Color FromArgb(int rojo, int verde, int azul);


static
Color
FromArgb(int
alpha,
Color
baseColor);
static Color FromArgb(int alpha, int rojo, int verde, int
static

Color

FromArgb(int

argb);

El camino ms usual para representar un color es a travs del primer constructor,


pasndole 3 enteros entre 0 y 255, que corresponden a las cantidades de la mezcla de
los colores rojo, verde y azul, donde 0 representa una cantidad de color nula y 255 la
mxima, un 100% de color.
Por ejemplo:
Color
rojo
=
Color.FromArgb(255,
Color negro = Color.FromArgb(0, 0, 0);

0,

0);

Color mezcla = Color.FromArgb(150, 200, 100);

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

Hay cientos de colores definidos.

8/16

Marco Besteiro y Miguel Rodrguez

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.

El constructor ms usual es:


public Point(int x, int y);

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

Los mtodos y propiedades ms importantes son:


int X
int Y
int Left
int Right
int Top
int Bottom
int Height

Coordenada x de la esquina superior izquierda del


rectngulo.
Coordenada y de la esquina superior izquierda del
rectngulo.
Coordenada x de la esquina superior izquierda..
Coordenada x de la esquina inferior derecha del rectngulo.
Coordenada y de la esquina superior izquierda del
rectangulo.
Coordenada y de la esquina inferior derecha del rectangulo.
Altura del rectangulo.

9/16

Marco Besteiro y Miguel Rodrguez

int Width
Point Location
Size Size
bool IsEmpty()

GDI+

Ancho del rectngulo.


Coordenadas de la esquina superior
rectngulo.
Tamao del rectngulo.
Examina si Width o Height son 0.

izquierda

del

void Offset(int dx, int dy) Traslada el rectangulo.


bool Contains(Point p) Devuelve true o false dependiendo de que el punto p est

situado en el interior del rectngulo que invoca al mtodo

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

Marco Besteiro y Miguel Rodrguez

GDI+

El fichero puede estar en cualquiera de los formatos grficos ms comunes: .bmp,


.gif, .png y .jpg.
La clase System.Drawing.Graphics tiene mtodos para visualizar imgenes en la
pantalla.Por ejemplo, se puede utilizar el mtodo DrawImageUnscaled:
g. DrawImageUnscaled(unaImagen, unPunto);

donde, g es el dispositivo grfico el objeto Graphics- y unPunto es un objeto de tipo


Point, que representa la esquina superior izquierda de la imagen en el contenedor.
Mtodos

public static Image FromFile(string fich)

Devuelve un objeto Image desde el fichero especificado. Es un mtodo esttico.

public void Save(string unFichero)

Salva la imagen con el nombre que se especifica

Propiedades

int Height

Obtiene la altura del objeto Image. De slo lectura


Size Size

Obtiene la dimensin de la imgen.


int Width

Obtiene la anchura del objeto Image. De slo lectura

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

Marco Besteiro y Miguel Rodrguez

GDI+

Figura 19.1. Evento Resize de un formulario que visualiza un fichero grfico.


Para ello, se siguen los siguientes pasos:
a) Cree un nuevo proyecto y denomnelo como GDIAplicacionUno.
b) Aada un campo privado a la clase Form1:
private Image unaImagen;

c) En el constructor del formulario, escriba las lneas siguientes:


unaImagen=Image.FromFile(@"c:\Muestra.jpg");

Nota: Puede cambiar el argumento del mtodo FromFile y sustituirlo por


cualquier fichero grfico que se tenga en el PC en el que se realice el ejemplo.
d) La imagen se presenta en el evento OnResize(). Escriba el siguiente cdigo en
dicho evento;
private void Form1_Resize(object sender, System.EventArgs e)
{
Graphics g=CreateGraphics();
Image unaImagen=Image.FromFile(@"c:\temporal\Muestra.jpg");
g.DrawImage(unaImagen,0,0,this.Size.Width,this.Size.Height);
g.Dispose();
}

e) Adems es importante modificar el mtodo Dispose() del formulario para


eliminar de memoria la referencia al objeto Image, porque ocupa gran cantidad
de memoria. Se debe hacer esto siempre que no se necesite la imagen. Para ello,
aada al final del mtodo la siguiente lnea:

12/16

12

Marco Besteiro y Miguel Rodrguez

GDI+

unaImagen.Dispose();

El cdigo completo es el siguiente:


using
using
using
using
using
using

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

Marco Besteiro y Miguel Rodrguez

GDI+

Graphics g=CreateGraphics();
Image unaImagen=Image.FromFile(@"c:\Muestra.jpg");

g.DrawImage(unaImagen,0,0,
this.Size.Width,this.Size.Height);
g.Dispose();
}
}
}

A continucin se implementa otra aplicacin que dibuja un rectgulo y un crculo


cuando se pulsa un botn y cuando se redimensiona la ventana con unas coordenadas y
dimensiones especificadas en unos cuadros de texto (ver figura 19.2).

Para ello, cree un nuevo proyecto, de nombre GDIAplicacionDos

Site dos controles GroupBox y dentro de ellos cuatro etiquetas y cuatro


cajas de texto como se indica en la figura 19.2:

Figura 19.2. Aspecto final de la aplicacin AplicacionGDIDos

Asigne los textos Dimensiones rectangulo y Dimensiones elipses a los


GroupBox y dje sus nombres por defecto.

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.

En el GroupBox de la parte superior que define las dimensiones del rectngulo,


asigne a la propiedad Text de las cajas de texto los valores siguientes: 10, 10, 50, 50

14/16

14

Marco Besteiro y Miguel Rodrguez

GDI+

y asigne las siguientes propiedades Name a cada una de ellas: txtX, txtY, txtAncho
y txtAlto.

Haga lo mismo en el grupo de la parte inferior, pero asigne las siguientes


propiedades Name a las cajas de texto: txtPaintX, txtPaintY, txtPaintAncho,
txtPaintAlto y deje los siguientes valores de la propiedad Text: 100, 100, 30, 30.

En el evento Paint del formulario, escriba el siguiente cdigo:


protected override void OnPaint(PaintEventArgs e)
{
//Obtiene el objeto Graphics
Graphics g=e.Graphics;
//Obtiene las dimensiones de la elipse
int x=int.Parse(txtPaintX.Text);
int y=int.Parse(txtPaintY.Text);
int ancho=int.Parse(txtPaintAncho.Text);
int alto=int.Parse(txtPaintAlto.Text);
Rectangle r=new Rectangle(x,y,ancho,alto);
//Define una brocha y un lpiz
Brush brocha=Brushes.Blue;
Pen lapiz = new Pen(brocha,5);
//Dibuja el rectngulo
g.DrawEllipse(lapiz,r);
}

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

Marco Besteiro y Miguel Rodrguez

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

También podría gustarte