03 octubre 2007

Como poner una imagen de fondo en una aplicación MDI

En un artículo anterior vimos como crear aplicaciones MDI gestionando múltiples ventanas hijas dentro de la ventana padre.

Una de las cosas que más dan vistosidad a una aplicación comercial es tener un fondo con nuestra marca de fondo de la aplicación (al estilo Contaplus o Facturaplus).

Para introducir una imagen de fondo en la ventana padre MDI hay que hacer lo siguiente:

- Introducir en la ventana padre (la que tiene la propiedad FormStyle a MDIForm) un componente de la clase TImage situado en la pestaña Additional. Al componenente lo vamos a llamar Fondo.

- En dicha imagen vamos a cambiar la propidedad Align a alClient para que ocupe todo el fondo del formulario padre.

- Ahora sólo falta cargar la imagen directamente:

Fondo.Picture.LoadFromFile( 'c:\imagenes\fondo.bmp' );

El único inconveniente que tiene esto es que no podemos utilizar los eventos del formulario al estar la imagen encima (Drag and Drop, etc).

UTILIZANDO EL CANVAS

Otra forma de hacerlo sería poniendo el objeto TImage en medio del formulario pero de manera invisible (sin alClient). Después en el evento OnPaint del formulario copiamos el contenido de la imagen TImage al fondo del formulario:

procedure TFormulario.FormPaint( Sender: TObject );
var R: TRect;
begin
R.Left := 0;
R.Top := 0;
R.Right := Fondo.Width;
R.Bottom := Fondo.Height;
Canvas.CopyRect( R, Fondo.Canvas, R );
end;

Así podemos tener igualmente una imagen de fondo sin renunciar a los eventos del formulario (OnMouseMove, OnClick, etc.).

Pruebas realizadas en Dephi 7.

6 comentarios:

Percy dijo...

Buenas Tardes a Todos.
Que tan bueno es poner una imagen de fondo en las pantallas o en ciertos controles como las grillas. Esto no restaria rápidez en la carga de la misma ventana o en el invalidate de la grilla.
Hago esta pregunta xq al menos tengo clientes que tienen PentiumIII (jeje, no se rian.)

Gracias.

Administrador dijo...

Yo también tengo algunos clientes que tienen un PC de la segunda guerra mundial. A veces hay que buscar un equilibrio entre diseño y eficacia. Yo prefiero la eficacia.

Si hay algo en mi programa que relentice al usuario lo quito sin pensarlo. Al fin y al cabo los programas son para trabajar (el que quiera ver cosas bonitas que se vaya a un museo).

Por otro lado se pueden hacer trucos en el programa utilizando doble buffer o utilizando las librerías SDL, Open GL y DirectX. Ya contaré como hacerlo en otra ocasión.

Javier Acosta dijo...

Y para ponerla como un mosaico... ¿alguna idea?

Administrador dijo...

Para ponerla como mosaico lo que hacemos es dibujar tantas copias de la imagen como filas y columnas quepan sobre el formulario. Se haría así:

procedure TFormulario.FormPaint( Sender: TObject );
var
R: TRect;
x, y: Integer;
begin
// Imagen como mosaico

R.Left := 0;
R.Top := 0;
R.Right := Fondo.Width;
R.Bottom := Fondo.Height;
Canvas.CopyRect( R, Fondo.Canvas, R );

for y := 0 to Height div Fondo.Height do
for x := 0 to Width div Fondo.Width do
Canvas.Draw( x * Fondo.Width, y * Fondo.Height, Fondo.Picture.Graphic );
end;

Javier Acosta dijo...

Estupendo lo del mosaico!

PD: felicidades por el Blog.

H,M dijo...

Tengo un software, pero quiero ponerle una imagen a los archivos que gusrda, algo asi como para que los archivos que lee el programa se reconozcan con una imagen, que la extension que reconoce el programa o formato, tenga una imagen

Publicidad