8 de julio de 2008

Estirar y mantener una imagen en la pantalla principal (_Screen)

Como vimos en artículos anteriores publicados en este Blog, la manera de poner una imagen de fondo en la pantalla principal de Visual FoxPro es agregar un objeto Image al objeto _Screen.
Esta imagen la podemos iniciar centrada con:

-- Centrar una imagen en la pantalla principal (_Screen) --
http://comunidadvfp.blogspot.com/2002/03/centrar-una-imagen-en-la-pantalla.html

Y mantenerla centrada, aun cuando cambiamos el tamaño de la ventana principal con:

-- Mantener centrada una imagen en la pantalla principal (_Screen) --
http://comunidadvfp.blogspot.com/2006/01/mantener-centrada-una-imagen-en-la.html

Ahora lo que deseamos es que la imagen de fondo, cubra toda la pantalla principal, y se ajuste automáticamente el tamaño cuando redimensionamos la ventana.

Para hacer esto tenemos al menos dos formas distintas obteniendo el mismo resultado buscado.
1. A partir de VFP 8.0, podemos utilizar la función BINDEVENT() para enlazar el método Resize del objeto _Screen, con un método personalizado en nuestro objeto Image.

_SCREEN.ADDOBJECT("oImagen","MiImagen")
WITH _Screen.oImagen
  lcPicture = GETPICT()
  .PICTURE = lcPicture
   .STRETCH = 2 && 1=Mantiene las proporciones, 2=Cubre todo
  *-- Solo si la imagen tiene transparencia
  * .BACKSTYLE = 0 && 0=Transparente, 1=Opaca
  .LEFT = 0
  .TOP = 0
  .WIDTH = _SCREEN.WIDTH
  .HEIGHT = _SCREEN.HEIGHT
  BINDEVENT(_SCREEN,"Resize",_SCREEN.oImagen,"MiResize")
  .VISIBLE = .T.
ENDWITH

DEFINE CLASS MiImagen AS IMAGE
  PROCEDURE MiResize
    WITH THIS
      .LEFT = 0
      .TOP = 0
      .WIDTH = _SCREEN.WIDTH
      .HEIGHT = _SCREEN.HEIGHT
    ENDWITH
  ENDPROC
  PROCEDURE DESTROY
    UNBINDEVENT(THIS)
  ENDPROC
ENDDEFINE

2. A partir de VFP 9.0 podemos utilizar solo la propiedad Anchor del objeto Image, sin utilizar la función BINDEVENT(), y sin la necesidad de tener una clase personalizada Image con un método que maneje su redimensionamiento.

_SCREEN.ADDOBJECT("oImagen","Image")
WITH _Screen.oImagen
  lcPicture = GETPICT()
  .PICTURE = lcPicture
   .STRETCH = 2 && 1=Mantiene las proporciones, 2=Cubre todo
  *-- Solo si la imagen tiene transparencia
  * .BACKSTYLE = 0 && 0=Transparente, 1=Opaca
  .LEFT = 0
  .TOP = 0
  .WIDTH = _SCREEN.WIDTH
  .HEIGHT = _SCREEN.HEIGHT
  .ANCHOR = 15
  .VISIBLE = .T.
ENDWITH

Hay tres cosas (solo dos si no se utiliza la propiedad Anchor) que debemos tener en cuenta para un mejor resultado visual:
  1. Según el tipo y proporciones de ancho/alto de la imagen original, hay que ver si es mejor mantener las poporciones de la imagen; o llenar toda la pantalla con la imagen sin mantener sus proporciones. Para ello debemos configurar la propiedad Stretch con el valor 1 si queremos mantener las proporciones de la imagen, o el valor 2 si queremos llenar toda la pantalla con la imagen.
  2. Si la imagen no posee transparencias, la propiedad BackStyle debe tener el valor 1, que es su valor por omisión. Solo si la imagen posee transparencias se debe configurar la propiedad BackStyle con el valor 0. De otra manera se obtienen resultados no deseados cuando se redimensiona la imagen
  3. En el caso de utilizar la propiedad Anchor, esta debe configurarse al final, luego de que se configuren las propiedades Left, Top, Height y Width de la imagen.
Hasta la próxima.

Luis María Guayán