none
Como cambiar el tamaño y poder mover un form sin FormBorderStyle RRS feed

  • Pregunta

  • Tengo un Form en el cual le quité el FormBorderStyle, porque quiero que quede sin los bordes de una típica ventana de windows, quiero que sólo quede la aplicación como si estuviera en ventana completa, pero al poner None en el FormBorderStyle pierdo las opciones de minimizar, cerrar y expandir, lo cual es bueno ya que quería hacerlas personalizadas también, es decir con iconos diferentes, lo malo es que obviamente no puedo mover ni cambiar el tamaño de mi Form, pero me pregunto si en código hay forma de hacerlo sin tener que ponerle un bode de windows, gracias de antemano.
    sábado, 30 de abril de 2016 18:24

Respuestas

  • Hola,

    Efectivamente, al deshabilitar los bordes el formulario quedará estático, sin poderlo trasladar.

    Lo que puedes es sobrescribir el método WndProc :

            private const int cGrip = 16;      // Grip size
            private const int cCaption = 32;   // Altura de barra de título;
    
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == 0x84)
                {  
                    Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
                    pos = this.PointToClient(pos);
                    if (pos.Y < cCaption)
                    {
                        m.Result = (IntPtr)2;
                        return;
                    }
                    if (pos.X >= this.ClientSize.Width - cGrip && pos.Y >= this.ClientSize.Height - cGrip)
                    {
                        m.Result = (IntPtr)17; 
                        return;
                    }
                }
                base.WndProc(ref m);
            }

    Lo que hace es permitir que el usuario pueda arrastrar el formulario de la parte superior, además de cambiarlo de tamaño (resize) desde la esquina inferior derecha.

    Más información, aquí un hilo similar en StackO.

    Para cambiar el tamaño del formulario (maximizar, restablecer, minimizar), tienes que crear tus propios controles, ya sean botones o labels , y usar el WindowState.

          private void btnSalir_Click(object sender, EventArgs e)
            {
                this.Close();
            }
    
            private void btnMaximizar_Click(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Maximized;
    
                //El form se maximizó
    
                //Ocultamos el botón maximiza
                btnMaximizar.Visible = false;
    
                //Mostramos el botón restablecer
                btnRestablecer.Visible = true;
            }
    
            private void btnMinimizar_Click(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Minimized;
            }
    
            private void btnRestablecer_Click(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Normal;
    
                //El form se restableció a su tamaño
    
                //Ocultamos el botón restablecer
                btnRestablecer.Visible = false;
    
                //Mostramos el botón maximizar
                btnMaximizar.Visible = true;
            }

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI



    sábado, 30 de abril de 2016 20:20
  • Hola Nicolás Angarita Ortiz.

    Acá te dejo un link bastante interesante sobre lo de cambiar el tamaño: https://msdn.microsoft.com/es-es/library/dn602528.aspx?f=255&MSPPError=-2147217396

    -

    Está en vb, pero facilmente se puede traducir:

        'PictureBox puede ser cualquier control
        'que quieras que funcione como barra de titulo
        Public ex, ey As Integer
        Public Arrastre As Boolean
        Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
            ex = e.X
    
            ey = e.Y
    
            Arrastre = True
        End Sub
        Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
            If Arrastre Then Me.Location = Me.PointToScreen(New Point(Me.MousePosition.X - Me.Location.X - ex, Me.MousePosition.Y - Me.Location.Y - ey))
        End Sub
        Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
            Arrastre = False
        End Sub
        Private Sub Minimizar_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Me.WindowState = FormWindowState.Minimized
        End Sub
        Private Sub Maximizar_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Me.WindowState = FormWindowState.Maximized
        End Sub

    Acá se encuentran algunos traductores:

    https://www.google.com.ar/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=vb%20net%20a%20c%23


    Saludos. Atentamente Pablo Fac. [VB.Net - Visual Studio 2015]


    sábado, 30 de abril de 2016 20:39

Todas las respuestas

  • Hola,

    Efectivamente, al deshabilitar los bordes el formulario quedará estático, sin poderlo trasladar.

    Lo que puedes es sobrescribir el método WndProc :

            private const int cGrip = 16;      // Grip size
            private const int cCaption = 32;   // Altura de barra de título;
    
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == 0x84)
                {  
                    Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
                    pos = this.PointToClient(pos);
                    if (pos.Y < cCaption)
                    {
                        m.Result = (IntPtr)2;
                        return;
                    }
                    if (pos.X >= this.ClientSize.Width - cGrip && pos.Y >= this.ClientSize.Height - cGrip)
                    {
                        m.Result = (IntPtr)17; 
                        return;
                    }
                }
                base.WndProc(ref m);
            }

    Lo que hace es permitir que el usuario pueda arrastrar el formulario de la parte superior, además de cambiarlo de tamaño (resize) desde la esquina inferior derecha.

    Más información, aquí un hilo similar en StackO.

    Para cambiar el tamaño del formulario (maximizar, restablecer, minimizar), tienes que crear tus propios controles, ya sean botones o labels , y usar el WindowState.

          private void btnSalir_Click(object sender, EventArgs e)
            {
                this.Close();
            }
    
            private void btnMaximizar_Click(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Maximized;
    
                //El form se maximizó
    
                //Ocultamos el botón maximiza
                btnMaximizar.Visible = false;
    
                //Mostramos el botón restablecer
                btnRestablecer.Visible = true;
            }
    
            private void btnMinimizar_Click(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Minimized;
            }
    
            private void btnRestablecer_Click(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Normal;
    
                //El form se restableció a su tamaño
    
                //Ocultamos el botón restablecer
                btnRestablecer.Visible = false;
    
                //Mostramos el botón maximizar
                btnMaximizar.Visible = true;
            }

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI



    sábado, 30 de abril de 2016 20:20
  • Hola Nicolás Angarita Ortiz.

    Acá te dejo un link bastante interesante sobre lo de cambiar el tamaño: https://msdn.microsoft.com/es-es/library/dn602528.aspx?f=255&MSPPError=-2147217396

    -

    Está en vb, pero facilmente se puede traducir:

        'PictureBox puede ser cualquier control
        'que quieras que funcione como barra de titulo
        Public ex, ey As Integer
        Public Arrastre As Boolean
        Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
            ex = e.X
    
            ey = e.Y
    
            Arrastre = True
        End Sub
        Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
            If Arrastre Then Me.Location = Me.PointToScreen(New Point(Me.MousePosition.X - Me.Location.X - ex, Me.MousePosition.Y - Me.Location.Y - ey))
        End Sub
        Private Sub PictureBox1_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseUp
            Arrastre = False
        End Sub
        Private Sub Minimizar_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Me.WindowState = FormWindowState.Minimized
        End Sub
        Private Sub Maximizar_Click(sender As Object, e As EventArgs) Handles Button3.Click
            Me.WindowState = FormWindowState.Maximized
        End Sub

    Acá se encuentran algunos traductores:

    https://www.google.com.ar/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=vb%20net%20a%20c%23


    Saludos. Atentamente Pablo Fac. [VB.Net - Visual Studio 2015]


    sábado, 30 de abril de 2016 20:39
  • Muchas gracias a ambos por sus respuestas, ya logré hacerlo gracias a ustedes, ahora estudiaré bien el código para un posterior uso.
    domingo, 1 de mayo de 2016 1:43