22 octubre 2007

Dibujando con la clase TCanvas (II)

Una vez que ya sabemos como dibujar las figuras básicas con el objeto Canvas pasemos ahora a ver algunas más complicadas.


DIBUJAR UN POLIGONO SOLO CON LINEAS


Para dibujar un polígono transparente utilizando líneas tenemos el procedimiento:

procedure Polyline( Points: array of TPoint );

Funciona exactamente igual que el procedimiento Polygon salvo que no cierra el polígono automáticamente, es decir, el último punto y el primero tiene que ser el mismo (para crear el polígono, aunque puede realizarse cualquier otra figura). Este procedimiento es equivalente a crear un trazado de líneas utilizando el procedimiento LineTo. Veamos un ejemplo:

with Canvas do
begin
Pen.Color := clBlack;
SetLength( Puntos, 4 );
Puntos[0].x := 200;
Puntos[0].y := 250;
Puntos[1].x := 250;
Puntos[1].y := 300;
Puntos[2].x := 150;
Puntos[2].y := 300;
Puntos[3].x := 200;
Puntos[3].y := 250;
PolyLine( Puntos );
end;

Este sería el resultado:


DIBUJAR POLIGONOS BEZIER

Los polígonos de Bezier se dibujan trazando curvas entre todos los puntos del polígono, es decir, son polígonos con las esquinas muy redondeadas. El procedimiento para dibujarlos es el siguiente:

with Canvas do
begin
Pen.Color := clBlack;
SetLength( Puntos, 4 );
Puntos[0].x := 80;
Puntos[0].y := 250;
Puntos[1].x := 150;
Puntos[1].y := 300;
Puntos[2].x := 10;
Puntos[2].y := 300;
Puntos[3].x := 80;
Puntos[3].y := 250;
PolyBezier( Puntos );
end;

Este sería el resultado:


Aunque he dado las mismas coordenadas que un triángulo, tiene las esquinas inferiores redondeadas.

ESCRIBIENDO TEXTO

Para escribir texto encima de una imagen con la clase TCanvas tenemos el método:

procedure TextOut( X, Y: Integer; const Text: string );

Este método toma como parámetros las coordenadas donde va a comenzar a escribirse el texto y el texto a escribir. Por ejemplo:

with Canvas do
begin
TextOut( 10, 10, 'Escribiendo texto mediante el Canvas del formulario' );
end;

Al no especificar fuente ni color quedaría del siguiente modo:


Cuando se escribe texto en un formulario la fuente, el color del texto y el color del fondo vienen predeterminados por las propiedades Brush y Font del Canvas. Supongamos que quiero escribir texto con fuente Tahoma, negrita, 10 y de color azul con fondo transparente:

with Canvas do
begin
Brush.Style := bsClear;
Font.Color := clBlue;
Font.Name := 'Tahoma';
Font.Size := 10;
TextOut( 200, 50, 'Otro texto de prueba' );
end;

Aquí tenemos nuestro texto personalizado:


Pero nos puede surgir un pequeño problema. ¿Como podemos averiguar lo que va a ocupar en pixels el texto que vamos a escribir? Pues para ello tenemos la siguiente función:

function TextWidth( const Text: string ): Integer;

Nos devuelve el ancho en pixels del texto que le pasamos como parámetro según como esté la propiedad Font antes de llamar a esta función. Y si queremos saber su altura entonces tenemos esta otra función:

function TextHeight( const Text: string ): Integer;

Lo que afecta a esta función principalmente es la propiedad Font.Size del Canvas. También tenemos esta otra función para obtener simultáneamente el ancho y alto del texto a escribir:

function TextExtent( const Text: string ): TSize;

Donde TSize es una estructura definida en la unidad Types del siguiente modo:

type
tagSIZE = packed record
cx: Longint;
cy: Longint;
end;
TSize = tagSIZE;

COMO RELLENAR LAS FIGURAS DE UN COLOR

Todos los programas de dibujo incorporan la función de rellenar con pintura una imagen hasta que encuentre bordes. Es como volcar un bote de pintura sobre las superficie hasta que choque con algo. El Canvas del formulario dispone del procedimiento:

procedure FloodFill( X, Y: Integer; Color: TColor; FillStyle: TFillStyle );

Los parámetros X, Y especifican donde se va a comenzar a pintar, el parámetro Color establece el color del borde donde va a chocar la pintura y FillStyle define el modo de pintar. Veamos un ejemplo de cómo pintar un triángulo de rojo con bordes negros:

with Canvas do
begin
Brush.Color := clRed;
FloodFill( 200, 270, clBlack, fsBorder );
end;

El último parámetro (FillStyle) se utiliza para decirle a la función si queremos que pinte hasta el borde de un color en concreto (clBlack y fsBorder) o si deseamos que dibuje toda la superficie de un color hasta que encuentre un color distinto. Por ejemplo:

with Canvas do
begin
Brush.Color := clRed;
FloodFill( 200, 270, clSilver, fsSurface );
end;

En este caso le he dicho que me pinte de rojo toda la superficie cuyo fondo es de color clSilver. Si encuentra un color que no sea clSilver entonces se para. Esa es la diferencia entre los valores fsBorder (un sólo borde) y fsSurface (cualquier borde pero la misma superficie). En ambos ejemplos he rellenado de color rojo el polígono creado al principio de este artículo:


En el próximo artículo terminaremos de ver las propiedades de la clase TCanvas.

Pruebas realizadas en Delphi 7.

Publicidad