Sie sind auf Seite 1von 16

Marco Besteiro y Miguel Rodrguez GDI+

1/16 1
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 Syst em. Dr awi ng proporciona acceso a la funcionalidad bsica del GDI+.
Adems, se proporcionan otras clases y estructuras en los namespace Syst em. Text ,
Syst em. Pr i nt i ng, Syst em. I magi ng, Syst em. Dr awi ng2D y Syst em. Desi gn.

El namespace System.Drawing
Las clases y estructuras ms importantes del namespace Syst em. Dr awi ng son:
Clases

Bi t map
Encapsula un bitmap GDI+. Se utiliza para trabajar con
imgenes.
Br ush y Br ushes
Se utilizan para rellenar reas cerradas con un
determinado patrn, color o bitmap.
Font
Define el tipo de letra
Font Fami l y
Define una familia de tipos de letra con una similitud
bsica en el diseo y una cierta variacin en el estilo.
Gr aphi cs
Encapsula la superficie grfica del GDI+.
I con
Se utilizan para trabajar con iconos.
I mage
Clase base abstracta que proporciona funcionalidad para
las clases Bi t map, I con y Met af i l e.
Pen y Pens
Para dibujar lneas, curvas, figuras, etc
Regi on
Describe el interior de una superficie.
Sol i dBr ush
Define un objeto brush de color simple.

Estructuras

Col or
Color ARGB.
Poi nt y Poi nt F
Para trabajar con puntos en el plano.
Rect angl e y Rect angl eF
Para trabajar con rectngulos.
Si ze y Si zeF
Para trabajar con las dimensiones de una figura.


Enumeraciones

Cont ent Al i gnment
Especifica el alineamiento del contenido de
una figura.
Marco Besteiro y Miguel Rodrguez GDI+

2/16 2
Font St yl e
Estilo del texto.
Gr aphi csUni t
Especifica la unidad de medida de los
datos.

Para trabajar con el GDI+ es imprescindible comprender la clase Gr aphi cs que
proporciona mtodos para dibujar en la pantalla, como Rect angl e y Poi nt . Por eso, se
estudiar en primer lugar. Posteriormente se explicarn las clases y estructuras ms
utilizadas y comunes del GDI+como Pen, Br ush, Rect angl e, Poi nt , etc.
Clases y estructuras del namespace System.Drawing
La clase Graphics
Gr aphi cs 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 Gr aphi cs de la superficie. En general, se utiliza el evento Pai nt del
formulario para obtener una referencia al objeto Gr aphi cs del formulario porque
cuando ocurre ese evento se le pasa como argumento al mtodo manejador un objeto de
la clase Pai nt Event Ar gs que tiene una propiedad que tambin se llama Gr aphi cs que
devuelve el objeto Graphics del formulario.
pr i vat e voi d f or mul ar i o_Pai nt ( obj ect sender , Pai nt Event Ar gs e)
{
Gr aphi cs g = e. Gr aphi cs;
/ / cdi go
}
Otras formas de obtener el objeto Graphics son las siguientes:
a) Sobreescrir el mtodo OnPai nt ( ) , que es un mtodo virtual que la clase For m
hereda de la clase Cont r ol . Por ejemplo
pr ot ect ed over r i de voi d OnPai nt ( Pai nt Event Ar gs e)
{
Gr aphi cs g = e. Gr aphi cs;
}
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 Pai nt . En estas
situaciones, se puede obtener el objeto Gr aphi cs invocando al mtodo
Cr eat eGr aphi cs( ) del formulario. En este ltimo caso cuando lo obtiene el
programador directamente a travs de Cr eat eGr aphi cs( ) - es muy importante invocar
al mtodo Di spose( ) 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 Gr aphi cs:
pr i vat e voi d f or mul ar i o_Cl i ck( obj ect sender , Event Ar gs e)
{
Gr aphi cs g = t hi s. Cr eat eGr aphi cs( ) ;
/ / cdi go
g. Di spose( ) ; / / Muy i mpor t ant e l i ber ar r ecur sos
Marco Besteiro y Miguel Rodrguez GDI+

3/16 3
/ / cuando se ut i l i za est e mt odo
}
c) El objeto Gr aphi cs se puede tambin obtener a travs de distintos mtodos estticos
de la clase Syst em. Dr awi ng. Gr aphi cs que aceptan como parmetro un fichero y
devuelven un objeto grfico.
Por ejemplo:
Gr aphi cs g = Gr aphi cs. Fr omFi l e( @c: \ t empor al \ f i cher o. j pg) ;
Mtodos
Una vez que se tiene la referencia del objeto Gr aphi cs se puede invocar cualquier
miembro de la clase Gr aphi cs para dibujar objetos. Los mtodos ms importantes de
esta clase son:
Dr awAr c
Dibuja un arco.
Dr awBezi er
Dibuja una curva de Bezier.
Dr awCur ve
Dibuja una curva definida por un array de puntos.
Dr awEl l i pse
Dibuja una elipse.
Dr awLi ne
Dibuja una lnea recta.
Dr awPol ygon
Dibuja un polgono.
Dr awRect angl e
Dibuja un rectngulo.
Fi l l El l i pse
Rellena el interior de una elipse.
Fi l l Pol ygon
Rellena el interior de un polgono definido por un array de puntos.
Fi l l Rect angl e
Rellena el interior de un rectngulo con un determinado Br ush.
Fi l l Rect angl es
Rellena el interior de una serie de rectngulos con un determinado
Br ush.
Fi l l Regi on
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:

Dr awI con
Dibuja un icono
Dr awI conUnst r et ched
Dibuja un icono con su tamao original en una
determinada posicin.
Dr awI mage
Sita una imagen en la pantalla
Dr awI mageUnscal ed
Dibuja una imagen con su tamao original y en un
determinado lugar.
Dr awSt r i ng
Escribe texto
Rot at eTr ansf or m
Gira la imagen un angulo especificado
Scal eTr ansf or m
Aplica una escala a la imagen
Tr ansl at eTr ansf or m
Desplaza la imagen

Marco Besteiro y Miguel Rodrguez GDI+

4/16 4

La gran mayora de ellos estn sobrecargados. Por ejemplo, considrese el mtodo
Dr awI con:

Para dibujar el icono unI cono en el rectngulo r .

publ i c voi d Dr awI con( I con unI cono, Rect angl e r ) ;
Para dibujar el icono unI cono en la posicin ( x, y) .
publ i c voi d Dr awI con( I con unI cono, i nt x, i nt y) ;
Otro ejemplo lo constituye el mtodo Dr awI mage. Los parmetros son muy elocuentes
de la funcin que realizan y por eso no se explicarn aqu:

publ i c voi d Dr awI mage( I mage unaI magen, Poi nt p) ;
publ i c voi d Dr awI mage( I mage unaI magen, Rect angl e r ) ;
publ i c voi d Dr awI mage( I mage unaI magen, i nt x, i nt y) ;
publ i c voi d Dr awI mage( I mage unaI magen, i nt ancho, i nt al t o) ;
publ i c voi d Dr awI mage( I mage unaI magen, i nt x, i nt y, i nt ancho, i nt
al t o) ;

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:

Gr aphi cs Fr omI mage( I mage unaI magen)
Crea un Nuevo objeto Gr aphi cs a partir del
objeto I mage especificado.
voi d Cl ear ( Col or unCol or )
Rellena la superficie con el color de fondo.
voi d Di spose( )
Borra el objeto Gr aphi cs 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 Br ush, Pen, Font y
Col or .
La clase Pen
La clase Syst em. Dr awi ng. 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:
publ i c Pen( Col or col or DeLi nea) ;
publ i c Pen( Br ush br ocha) ;
publ i c Pen( Br ush br ocha, f l oat anchoDeLi nea) ;
Marco Besteiro y Miguel Rodrguez GDI+

5/16 5
publ i c Pen( Col or col or DeLi nea, f l oat anchoDeLi nea) ;
Por ejemplo:
Pen unLapi z = new Pen( Col or . Or ange ) ;
Pen ot r oLapi z= new Pen( Col or . Yel l ow, 30 ) ;
Sin embargo, se puede utilizar la clase Syst em. Dr awi ng. 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 l api zSol i doAmar i l l o = Pens. Yel l ow;
Las propiedades ms importantes de la clase Pen son:
Br ush Def i ne el br ush ( l a br ocha) .
Col or Def i ne el col or .
Wi dt h Def i ne 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:

publ i c voi d Rot at eTr ansf or m(f l oat angulo);
publ i c voi d Tr ansl at eTr ansf or m( f l oat dx, f l oat dy) ;
publ i c voi d Scal eTr ansf or m( f l oat sx, f l oat sy) ;

Por ej empl o:

/ / Cr ea un obj et o Pen
Pen l api z = new Pen( Col or . Bl ack, 5) ;

/ / Di buj a un r ect angul o con el Pen l api z
e. Gr aphi cs. Dr awRect angl e( l api z, 10, 10, 100, 100) ;

/ / Escal a el l api z en l a di r ecci on X
l api z. Scal eTr ansf or m( 2, 1) ;

/ / Rot a 90 gr ados
l api z. Rot at eTr ansf or m( 90) ;

/ / Di buj a un segundo r ect angul o con l api z
e. Gr aphi cs. Dr awRect angl e( l api z, 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 Syst em. Dr awi ng. Br ush es
una clase base abstracta y no puede ser instanciada, es decir, no se pueden crear objetos
Marco Besteiro y Miguel Rodrguez GDI+

6/16 6
de esta clase. Para crear un objeto Br ush se debe utilizar alguna de sus clases derivadas
como Sol i dBr ush, Text ur eBr ush o Li near Gr adi ent Br ush.
Por ejemplo:
Br ush col or Sol i doBei ge = new Sol i dBr ush( Col or . Bei ge) ;
Br ush col or Nar anj aMar r on = new Sol i dBr ush( Col or . Fr omAr gb( 255, 150, 0) ) ;
Tambin puede utilizarse la clase Syst em. Dr awi ng. Br used. 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 Br ush del color que se ha especificado.
Por ejemplo:
Br ush sol i doAzul = Br ushes. Bl ue;
Br ush sol i doChocol at e = Br used. Chocol at e;
La clase Font
Esta clase permite trabajar y definir las caractersticas tipo, tamao, color, estilo, etc-
de letra en el objeto Gr aphi cs.
Los constructores ms importantes son:
publ i c Font ( Font Fami l y f ami l i a, f l oat t amao) ;
publ i c Font ( Font Fami l y f ami l i a, f l oat t amao, Font St yl e est i l o) ;
publ i c Font ( st r i ng t i poDeLet r a, f l oat t amao) ;
publ i c Font ( st r i ng t i poDeLet r a, f l oat t amao, Font St yl e est i l o) ;
publ i c Font ( Font f uent e, Font St yl e est i l o) ;

Font St yl e es una enumeracin con los siguientes miembros:
Bol d Texto en negrita.
I t al i c Texto en cursiva.
Regul ar Texto Normal.
St r i keout Texto tachado.
Under l i ne Texto subrayado

Marco Besteiro y Miguel Rodrguez GDI+

7/16 7
Por ejemplo:
Font unaFuent e = new Font ( Ver dana, 22) ;
Font ot r aFuent e = new Font ( Cour i er , 12) ;

Si se desea que la letra asigne varios de los estilos, basta con sumar el estilo de la
letra, utilizando el operador |.
Font segundaFuent e = new Font ( Geor gi a, 22, Bol d | I t al i c) ;
Las propiedades de Font ms importantes son:

Bol d Indica si la fuente es negrita.
Font Fami l y Obtiene el Font Fami l y de esa fuente.
Hei ght Obtiene la altura de la fuente.
I t al i c Indica si la fuente es cursiva.
Name Nombre de la fuente.
Si ze Tamao de la fuente..
Si zeI nPoi nt s Tamao, en puntos, de la fuente.
St r i keout Indica si la fuente est tachada.
St yl e Estilo de la fuente.
Under l i ne Indica si la fuente est subrayada.
Uni t Define la medida para la fuente actual.


Ejemplo:

pr ot ect ed over r i de OnPai nt ( Pai nt Event Ar gs e)
{
Gr aphi cs dc = e. Gr aphi cs;
Br ush br ochaAzul = Br ushes. Bl ue;
Br ush br ochaNegr a = Br ushes. Bl ack;
Font unaFuent e = new Font ( Ver dana, 22) ;
Font ot r aFuent e = new Font ( Ti mes New Roman, Font St yl e. I t al i c |
Font St yl e. Under l i ne) ;
dc. Dr awSt r i ng( Una f r ase, unaFuent e, br ochaAzul , 10, 100) ;

/ / Ms codi go
base. OnPai nt ( e) ;
}

Para obtener todas las fuentes del sistema, se puede utilizar la clase
I nst al l edFont Col l ect i on, del namespace Syst em. Dr awi ng. Text . Esta clase tiene
una propiedad, Fami l i e, que devuelve un array con todas las fuentes disponibles del
sistema.

I nst al l edFont Col l ect i on f uent es = new I nst al l edFont Col l ect i on( ) ;
Font Fami l y[ ] f ami l i a = f uent es. Fami l i es;
f or each ( Font Fami l y f i n f ami l i a)
Marco Besteiro y Miguel Rodrguez GDI+

8/16 8
{
/ / codi go
}
La estructura Color
La estructura Col or est representada por un color ARGB (Al pha, Red, Gr een, Bl ue). Las
propiedades son:
byt e A valor del componente alpha del Color.
byt e B valor del componente azul (Blue) del Color.
byt e G valor del componente verde (Green) del Color.
byt e R valor del componente rojo (Red) del Color.
Casi todos los miembros de la estructura Col or 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 Fr omAr gb, que define un objeto color. Este
mtodo est sobrecargado:
publ i c st at i c Col or Fr omAr gb( i nt r oj o, i nt ver de, i nt azul ) ;
publ i c st at i c Col or Fr omAr gb( i nt al pha, Col or baseCol or ) ;
publ i c st at i c Col or Fr omAr gb( i nt al pha, i nt r oj o, i nt ver de, i nt
azul ) ;
publ i c st at i c Col or Fr omAr gb( i nt ar gb) ;

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:
Col or r oj o = Col or . Fr omAr gb( 255, 0, 0) ;
Col or negr o = Col or . Fr omAr gb( 0, 0, 0) ;
Col or mezcl a = Col or . Fr omAr gb( 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
Col or con el color especificado.
Por eso, es lo mismo:
t hi s. BackCol or = Col or . Whi t e;
que:
t hi s. BackCol or = Col or . Fr omAr gb( 255, 255, 255) ;
Hay cientos de colores definidos.
Marco Besteiro y Miguel Rodrguez GDI+

9/16 9
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:
voi d Of f set ( i nt dx, i nt dy) , que t r asl ada el punt o en una cant i dad
dada.
El constructor ms usual es:
publ i c Poi nt ( i nt x, i nt y) ;
Por ejemplo:
Poi nt p1 = new Poi nt ( 30, 30) ;
Poi nt p2 = new Poi nt ( 130, 250) ;
Poi nt p3 = new Poi nt ( 0, 0) ;
p3. X = 15;
p3. Y = 45;
p1. Of f set ( 100, 100) ;
Syst em. Consol e. Wr i t eLi ne( p1 = {0}, p1) ;
Syst em. Consol e. Wr i t eLi ne( p2 = {0}, p2) ;
Syst em. Consol e. Wr i t eLi ne( p3 = {0}, p3) ;

Poi nt F es una estructura muy similar a Poi nt , excepto que X e Y son de tipo f l oat .
La estructura Rectangle
Esta estructura permite construir objetos que representan una regin rectangular. Como
sucede en la estructura Poi nt , tambin se define la estructura Rect angl eF, que es
idntica a sta pero que sus coordenadas son de tipo f l oat .

Los constructores de esta clase son:

publ i c Rect angl e( Poi nt esqui naSupI zda, Si ze t amao) ;
publ i c Rect angl e( i nt x, i nt y, i nt ancho, i nt al t o) ;
Los mtodos y propiedades ms importantes son:
i nt X Coordenada x de la esquina superior izquierda del
rectngulo.
i nt Y Coordenada y de la esquina superior izquierda del
rectngulo.
i nt Lef t Coordenada x de la esquina superior izquierda..
i nt Ri ght Coordenada x de la esquina inferior derecha del rectngulo.
i nt Top Coordenada y de la esquina superior izquierda del
rectangulo.
i nt Bot t om Coordenada y de la esquina inferior derecha del rectangulo.
i nt Hei ght Altura del rectangulo.
Marco Besteiro y Miguel Rodrguez GDI+

10/16 10
i nt Wi dt h Ancho del rectngulo.
Poi nt Locat i on Coordenadas de la esquina superior izquierda del
rectngulo.
Si ze Si ze Tamao del rectngulo.
bool I sEmpt y( ) Examina si Wi dt h o Hei ght son 0.

voi d Of f set ( i nt dx, i nt dy) Traslada el rectangulo.
bool Cont ai ns( Poi nt p) Devuelve t r ue o f al se dependiendo de que el punto p est
situado en el interior del rectngulo que invoca al mtodo


Por ejemplo:

Rect angl e r = new Rect angl e( 0, 0, 150, 200) ;
Poi nt p = new Poi nt ( 50, 50) ;
i f ( r . Cont ai ns( p) )
Syst em. Consol e. Wr i t eLi ne( p est en el i nt er i or de r ) ;
el se
Syst em. Consol e. Wr i t eLi ne( p est f uer a de r ) ;

La clase Size
Las estructuras Si ze y Si zeF son muy parecidas a Poi nt y Poi nt F.
Si ze tiene dos campos enteros Si zeF dos f l oat - que representan una distancia
horizontal y otra vertical, llamados Wi dt h y Hei ght respectivamente.

Aunque las estructuras son muy parecidas, Poi nt se utiliza para indicar donde est algo
y Si ze para definir su tamao.

Por ejemplo:

Poi nt punt o=new Poi nt ( 21, 78) ;
Si ze t amao=new Si ze( 40, 50) ,
Rect angl e r =new Rect angul o( punt o, t amao) ;
La clase Image
En C# es relativamente sencillo manipular imgenes, cambiando sus tamaos,
rotndolas, cortndolas, etc. La funcionalidad la proporciona la clase abstracta
Syst em. Dr awi ng. I mage. Una instancia de esta clase representa una imagen o un
dibujo. No tiene ningn constructor pblico. Sin embargo, tiene un mtodo, Fr omFi l e,
que devuelve un objeto de esta clase si se le pasa como argumento el nombre de un
fichero. Su estructura es:
publ i c st at i c I mage Fr omFi l e( st r i ng unFi cher o) ;
Por ejemplo:
I mage unaI magen = I mage. Fr omFi l e( @c: \ t empor al \ unaFot ogr af i a. j pg) ;
Marco Besteiro y Miguel Rodrguez GDI+

11/16 11
El fichero puede estar en cualquiera de los formatos grficos ms comunes: . bmp,
. gi f , . png y . j pg.
La clase Syst em. Dr awi ng. Gr aphi cs tiene mtodos para visualizar imgenes en la
pantalla.Por ejemplo, se puede utilizar el mtodo Dr awI mageUnscal ed:
g. Dr awI mageUnscal ed( unaI magen, unPunt o) ;
donde, g es el dispositivo grfico el objeto Gr aphi cs- y unPunt o es un objeto de tipo
Poi nt , que representa la esquina superior izquierda de la imagen en el contenedor.
Mtodos
publ i c st at i c I mage Fr omFi l e( st r i ng f i ch)

Devuelve un objeto I mage desde el fichero especificado. Es un mtodo esttico.

publ i c voi d Save( st r i ng unFi cher o)

Salva la imagen con el nombre que se especifica

Propiedades

i nt Hei ght
Obtiene la altura del objeto I mage. De slo lectura

Si ze Si ze
Obtiene la dimensin de la imgen.

i nt Wi dt h
Obtiene la anchura del objeto I mage. 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)

Marco Besteiro y Miguel Rodrguez GDI+

12/16 12


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 GDI Apl i caci onUno.

b) Aada un campo privado a la clase For m1:

pr i vat e I mage unaI magen;

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

unaI magen=I mage. Fr omFi l e( @" c: \ Muest r a. j pg" ) ;

Nota: Puede cambiar el argumento del mtodo Fr omFi l e 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 OnResi ze( ) . Escriba el siguiente cdigo en
dicho evento;

pr i vat e voi d For m1_Resi ze( obj ect sender , Syst em. Event Ar gs e)
{
Gr aphi cs g=Cr eat eGr aphi cs( ) ;
I mage unaI magen=I mage. Fr omFi l e( @" c: \ t empor al \ Muest r a. j pg" ) ;
g. Dr awI mage( unaI magen, 0, 0, t hi s. Si ze. Wi dt h, t hi s. Si ze. Hei ght ) ;
g. Di spose( ) ;
}

e) Adems es importante modificar el mtodo Di spose( ) del formulario para
eliminar de memoria la referencia al objeto I mage, 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:

Marco Besteiro y Miguel Rodrguez GDI+

13/16 13
unaI magen. Di spose( ) ;

El cdigo completo es el siguiente:

usi ng Syst em;
usi ng Syst em. Dr awi ng;
usi ng Syst em. Col l ect i ons;
usi ng Syst em. Component Model ;
usi ng Syst em. Wi ndows. For ms;
usi ng Syst em. Dat a;

namespace Apl i caci onGDI Uno
{
publ i c cl ass For m1 : Syst em. Wi ndows. For ms. For m
{
private Image unaImagen;
pr i vat e Syst em. Component Model . Cont ai ner component s = nul l ;

publ i c For m1( )
{
I ni t i al i zeComponent ( ) ;
unaImagen=Image.FromFile(@"c:\Muestra.jpg");
this.BackgroundImage=unaImagen;
}

pr ot ect ed over r i de voi d Di spose( bool di sposi ng )
{
i f ( di sposi ng )
{
i f ( component s ! = nul l )
{
component s. Di spose( ) ;
}
}
base. Di spose( di sposi ng ) ;
unaImagen.Dispose();
}

#r egi on Wi ndows For mDesi gner gener at ed code

pr i vat e voi d I ni t i al i zeComponent ( )
{
/ /
/ / For m1
/ /
t hi s. Aut oScal eBaseSi ze=new Syst em. Dr awi ng. Si ze( 5, 13) ;
t hi s. Cl i ent Si ze = new Syst em. Dr awi ng. Si ze( 292, 273) ;
t hi s. Name = " For m1" ;
t hi s. Text = " For m1" ;
t hi s. Resi ze+=new Syst em. Event Handl er ( For m1_Resi ze) ;

}
#endr egi on
[ STAThr ead]
st at i c voi d Mai n( )
{
Appl i cat i on. Run( new For m1( ) ) ;
}

private void Form1_Resize(object sender, EventArgs e)
{
Marco Besteiro y Miguel Rodrguez GDI+

14/16 14
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 GDI Apl i caci onDos

Site dos controles Gr oupBox 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 Apl i caci onGDI Dos

Asigne los textos Di mensi ones r ect angul o y Di mensi ones el i pses a los
Gr oupBox y dje sus nombres por defecto.

Dje las etiquetas con la propiedad Name que tienen por defecto, pero cambie en
todas ellas las propiedad Aut osi ze a t r ue y pnga su propiedad Text con los textos
que se indican en la figura 19.2.

En el Gr oupBox 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
Marco Besteiro y Miguel Rodrguez GDI+

15/16 15
y asigne las siguientes propiedades Name a cada una de ellas: t xt X, t xt Y, t xt Ancho
y t xt Al t o.

Haga lo mismo en el grupo de la parte inferior, pero asigne las siguientes
propiedades Name a las cajas de texto: t xt Pai nt X, t xt Pai nt Y, t xt Pai nt Ancho,
t xt Pai nt Al t o y deje los siguientes valores de la propiedad Text : 100, 100, 30, 30.

En el evento Pai nt del formulario, escriba el siguiente cdigo:

pr ot ect ed over r i de voi d OnPai nt ( Pai nt Event Ar gs e)
{
/ / Obt i ene el obj et o Gr aphi cs
Gr aphi cs g=e. Gr aphi cs;
/ / Obt i ene l as di mensi ones de l a el i pse
i nt x=i nt . Par se( t xt Pai nt X. Text ) ;
i nt y=i nt . Par se( t xt Pai nt Y. Text ) ;
i nt ancho=i nt . Par se( t xt Pai nt Ancho. Text ) ;
i nt al t o=i nt . Par se( t xt Pai nt Al t o. Text ) ;
Rect angl e r =new Rect angl e( x, y, ancho, al t o) ;

/ / Def i ne una br ocha y un l pi z
Br ush br ocha=Br ushes. Bl ue;
Pen l api z = new Pen( br ocha, 5) ;

/ / Di buj a el r ect ngul o
g. Dr awEl l i pse( l api z, r ) ;
}

Aada ahora un botn cuya propiedad Name sea bt nDi buj ar y la propiedad Text
Di buj ar y aada el siguiente cdigo al evento Cl i ck:

pr i vat e voi d bt nDi buj ar _Cl i ck( obj ect sender , Syst em. Event Ar gs e)
{
/ / obt i ene el obj et o Gr aohi cs
Gr aphi cs g=Cr eat eGr aphi cs( ) ;
/ / Obt i ene l as di mensi ones del r ect angul o
i nt x=i nt . Par se( t xt X. Text ) ;
i nt y=i nt . Par se( t xt Y. Text ) ;
i nt ancho=i nt . Par se( t xt Ancho. Text ) ;
i nt al t o=i nt . Par se( t xt Al t o. Text ) ;
Rect angl e r =new Rect angl e( x, y, ancho, al t o) ;

/ / Def i ne una br ocha
Br ush br ocha=Br ushes. Yel l ow;

/ / Di buj a el r ect ngul o
g. Fi l l Rect angl e( br ocha, r ) ;
/ / l i ber a l os r ecur sos
g. Di spose( ) ;
}

En este ejemplo se puede apreciar bien la funcionalidad del evento Pai nt . 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
Marco Besteiro y Miguel Rodrguez GDI+

16/16 16
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 OnPai nt .

Das könnte Ihnen auch gefallen