viernes, 14 de agosto de 2015

Windows Forms. Mostrar imagen a pantalla completa

Hace poco me realizaron una pregunta sobre cómo se puede mostrar una imagen a pantalla completa en Windows Forms. La verdad es que es algo que resulta muy sencillo de implentar en Windows Forms y que genera un efecto muy llamativo para el usuario.

Podemos realizar el efecto creando un formulario sin borde maximizado y con la imagen a mostrar como fondo.

La imagen a pantalla completa se cierra al hacer click sobre ella. Para ello añadiremos un controlador de eventos al evento Click del formulario que simplemente cerrará el formulario:

        private void FullScreenImage(Image imageToShow)
        {
            Form fullScreenForm = new Form()
            {
                WindowState = FormWindowState.Maximized,
                FormBorderStyle = FormBorderStyle.None,
                BackgroundImage=imageToShow,
                BackgroundImageLayout= ImageLayout.Zoom
            };

            fullScreenForm.Click += fullScreen_Click;

            fullScreenForm.ShowDialog();
        }

        private void fullScreen_Click(object sender, EventArgs e)
        {
            ((Form)sender).Close();
        }
    Private Sub FullScreenImage(imageToShow As Image)
        Dim fullScreenForm As New Form With {
                .WindowState = FormWindowState.Maximized,
                .FormBorderStyle = FormBorderStyle.None,
                .BackgroundImage = imageToShow,
                .BackgroundImageLayout = ImageLayout.Zoom
                }

        AddHandler fullScreenForm.Click, AddressOf fullScreen_Click

        fullScreenForm.ShowDialog()
    End Sub

    Private Sub fullScreen_Click(sender As Object, e As EventArgs)
        CType(sender, Form).Close()
    End Sub

Por ejemplo podríamos hacer que al hacer doble click sobre un PictureBox la imagen de éste se mostrase a pantalla completa simplemente añadiendo un controlador al evento DoubleClick del PictureBox:

        private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            FullScreenImage(((PictureBox)sender).Image);
        }
    Private Sub PictureBox1_DoubleClick(sender As Object, e As EventArgs) Handles PictureBox1.DoubleClick
        FullScreenImage(CType(sender, PictureBox).Image)
    End Sub


7 comentarios:

  1. Hola, Asier, le comento que le deje una contra consulta a una mia, por Ud. respondida, en el foro de c# del dia de ayer y antes de ayer, en el cual le consultaba sobre como podia cambiarle el estado a un TextBox.Enable = false que esta en un formulario, a TextBox.Enable = true en un segundo formulario, sugiriendome Ud. que pase un valor por querystring, no entendiendo bien a lo que se refiere.......Le recuerdo ello, mil gracias, disculpe las molestias, espero su respuesta alla......

    ResponderEliminar
    Respuestas
    1. Hola Guillermo. Ya te he contestado en el foro de msdn.

      Un saludo

      Eliminar
  2. se pudiera despues de abrir la imagen poder hacer zoom con el scroll asi como lo hace el visualizador de imágenes de windows?

    ResponderEliminar
  3. Entiendo que te refieres a la rueda del ratón ¿no?

    ResponderEliminar
    Respuestas
    1. Se complicaría un poco más.
      Habría que añadir un PictureBox al formulario y controlar su tamaño y posición en el evento MouseWheel.
      Además habría que añadir un controlador para el evento Load del form (para dimensionar incialmente el PictureBox) y para el click del PictureBox para cerrar el formulario.

      Algo así:

      private void FullScreenImage(Image imageToShow)
      {
      var fullScreenForm = new Form()
      {
      WindowState = FormWindowState.Maximized,
      FormBorderStyle = FormBorderStyle.None,
      };
      var picture = new PictureBox()
      {
      Image = imageToShow,
      SizeMode = PictureBoxSizeMode.Zoom
      };
      fullScreenForm.Controls.Add(picture);

      fullScreenForm.Load += fullScreen_Load;
      fullScreenForm.Click += fullScreen_Click;
      picture.Click += fullScreen_Click;
      fullScreenForm.MouseWheel += fullScreen_MouseWheel;

      fullScreenForm.ShowDialog();
      }

      private void fullScreen_Load(object sender, EventArgs e)
      {
      var form = (Form) sender;
      var pic = form.Controls.OfType()
      .First();
      pic.Location = new Point(0, 0);
      pic.Size = new Size(form.Width, form.Height);
      }

      private void fullScreen_MouseWheel(object sender, MouseEventArgs e)
      {
      var form = (Form)sender;
      var pic = form.Controls.OfType()
      .First();

      var incWidth = (int) (pic.Width*0.05);
      var incHeight = (int) (pic.Height*0.05);
      pic.Width += e.Delta < 0 ? -incWidth : incWidth;
      pic.Height += e.Delta < 0 ? -incHeight : incHeight;
      pic.Location = new Point(
      (form.Width - pic.Width)/2,
      (form.Height - pic.Height)/2
      );
      }

      private void fullScreen_Click(object sender, EventArgs e)
      {
      var form = ((Control) sender).FindForm();
      form?.Close();
      }

      Eliminar
  4. Hola Asier
    Como haría si le quiero pasar una ruta donde se encuentra la imgaen asi como esta:
    private string ruta = Path.Combine(Application.StartupPath, @"ImagenesForm\Moda.png");

    ResponderEliminar