Mostrar una imagen en graaaande

Se supone que la primera entrada de un blog debería ser una presentación, pero ni las presentaciones ni las despedidas se me dan bien, así que prefiero empezar con algo que me gusta: Visual Basic 2005 y con la solución a un pequeño problema que se me planteó:

Tengo un pequeño picturebox en un formulario donde se muestra la imagen asociada al registro en el que estemos (me da igual si hablamos de series, actores, muebles o coches).
Hay algunas imágenes que son bastante grandes y muy bonitas y verlas en un picturebox de 100×63 es una pena,así que decidí añadir un formulario con un picturebox que me mostrara la imagen a tamañocompleto. Básicamente, cogí un formulario (frmMostrarImagen) y le quite el texto del título y los bordes (FormBorderStyle=None). Le añadí un picturebox que debía ocupar todo el formulario (Dock=Fill). Este picturebox (picImagen) debe ajustarse al tamaño de la imagen (AutoSize=True). De igual modo, el formulario debe ajustarse al tamaño del picturebox, asíque su AutoSize también está en True y AutoSizeMode debe estar en GrowAndShrink.

Con esto ya sólo quedó añadir elcódigo necesario para que, pasándole la imagen a mostrar, la ponga en el picturebox y muestre el formulario.

Peeeeero… No queda bien. Si se le pasa una imagen con mayor resolución que la pantalla, sólo se ve una parte de la imagen. Mal íbamos. Por fortuna en My.Computer encontramos Screen y, dentro de Screen, WorkingArea. Sabiendo las dimensiones del área de trabajo de la pantalla estrivial comprobar si la imagen es más alta o ancha que el área de trabajo. En este caso pasaremos del AutoSize y ajustaremos el tamaño del picturebox al máximo que nos permita la resolución de pantalla, manteniendolas proporciones de la imagen.

En resumen, esto:

 
''' <summary>
''' Carga la imagen a mostrar y muestra el formulario de modo modal
''' </summary>
Public Sub MostrarImagen(ByRef queImagen As Image)
    'Comprobamos si el tamaño de la imagen (alto o ancho) es mayor
    'al área de trabajo de la pantalla. Si es así, ajustamos la imagen
    'al área de trabajo manteniendo las proporciones.
    If queImagen.Height > My.Computer.Screen.WorkingArea.Height _
    	OrElse queImagen.Width > My.Computer.Screen.WorkingArea.Width Then
        'Lo primero es poner el autosize del formulario a false
        'Si no lo hacemos y quitamos el autosize del picbox, no se muestra nada
        '(el formulario queda con tamaño 0)
        Me.AutoSize = False
        Me.picImagen.SizeMode = PictureBoxSizeMode.Zoom
        'Vemos que dimensión (ancho, alto) es mayor, pues será sobre la que ajustemos
        If queImagen.Size.Width > queImagen.Size.Height Then
        	Me.Width = My.Computer.Screen.WorkingArea.Width
            Me.Height = Me.Width * queImagen.Height / queImagen.Width
        Else
            Me.Height = My.Computer.Screen.WorkingArea.Height
            Me.Width = Me.Height * queImagen.Width / queImagen.Height
        End If
    End If
    Me.picImagen.Image = queImagen
    Me.ShowDialog()
 End Sub

Sólo queda hacer que el formulario se cierre (no hay barra de título, no hay como cerrarlo en principio). Cada cual tendrá sus formas, yo lo hice al hacer click sobre el picturebox y al pulsar cualquier tecla. Esto último en el evento KeyPress del formulario, previo hacer que el formulario capture las pulsaciones de las teclas antes que el picturebox (KeyPreview=True). De paso añadí un tooltip que mostrase un mensajito del tipo “Pulse la tecla any para cerrar esta ventana” y listo.

Fin de la primera entrada, nos vemos en el Forlon.

Actualización 08 de enero de 2008: he corregido la línea Me.Height = Me.Width * queImagen.Height / queImagen.Width y su equivalente con Width ya que no aparecía el símbolo de la división entera (la otra barra inclinada). Lo he sustituido por la barra de división normal, peeeeeero tiene que ser una división entera, o bien convertir el resultado en un entero.

Un comentario para “Mostrar una imagen en graaaande

  1. El Forlon Hope está un poco solitario ultimamente, sobre todo desde que unos tipos intentaron detonar una C.A.N.U.T.A. justo enfrente de la puerta.

Deja un comentario