Cómo mover un formulario Windows cuando su propiedad FormBorderStyle se establece en Ninguno?

StackOverflow https://stackoverflow.com/questions/1241812

  •  12-09-2019
  •  | 
  •  

Pregunta

Uso de C #.
Estoy tratando de mover un Form sin su barra de título.
He encontrado un artículo sobre él en: http://www.codeproject.com/KB/cs /csharpmovewindow.aspx

Se trabaja todo el tiempo que yo no puse FormBorderStyle como None.

¿Hay una manera de hacer que funcione con esta propiedad establecida como None?

¿Fue útil?

Solución

Sé que esta pregunta es más de un año de edad, pero yo estaba buscando tratando de recordar cómo lo he hecho en el pasado. Así que para cualquier otra persona de referencia, la forma más rápida y menos complejo que el enlace de arriba es para anular la función WndProc.

/*
Constants in Windows API
0x84 = WM_NCHITTEST - Mouse Capture Test
0x1 = HTCLIENT - Application Client Area
0x2 = HTCAPTION - Application Title Bar

This function intercepts all the commands sent to the application. 
It checks to see of the message is a mouse click in the application. 
It passes the action to the base action by default. It reassigns 
the action to the title bar if it occured in the client area
to allow the drag and move behavior.
*/

protected override void WndProc(ref Message m)
{
    switch(m.Msg)
    {
        case 0x84:
            base.WndProc(ref m);
            if ((int)m.Result == 0x1)
                m.Result = (IntPtr)0x2;
            return;
    }

    base.WndProc(ref m);
}

Esto permitirá a cualquier forma puede mover haciendo clic y arrastrando dentro del área de cliente.

Otros consejos

Aquí es la mejor manera que he encontrado. Se trata de un "camino .NET", wihout usando WndProc. Sólo tienes que controlar los eventos MouseDown, MouseMove y MouseUp de las superficies que desea ser arrastrable.

private bool dragging = false;
private Point dragCursorPoint;
private Point dragFormPoint;

private void FormMain_MouseDown(object sender, MouseEventArgs e)
{
    dragging = true;
    dragCursorPoint = Cursor.Position;
    dragFormPoint = this.Location;
}

private void FormMain_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        Point dif = Point.Subtract(Cursor.Position, new Size(dragCursorPoint));
        this.Location = Point.Add(dragFormPoint, new Size(dif));
    }
}

private void FormMain_MouseUp(object sender, MouseEventArgs e)
{
    dragging = false;
}

Yo tenía la misma pregunta hace un tiempo y durante la búsqueda de la respuesta que encontré el código de abajo (no recuerdo el sitio web) y aquí es lo que hago:

    Point mousedownpoint = Point.Empty;

    private void Form_MouseDown(object sender, MouseEventArgs e)
    {
        mousedownpoint = new Point(e.X, e.Y);
    }

    private void Form_MouseMove(object sender, MouseEventArgs e)
    {

        if (mousedownpoint.IsEmpty)
            return;
        Form f = sender as Form;
        f.Location = new Point(f.Location.X + (e.X - mousedownpoint.X), f.Location.Y + (e.Y - mousedownpoint.Y));

    }

    private void Form_MouseUp(object sender, MouseEventArgs e)
    {
        mousedownpoint = Point.Empty;
    }

En primer lugar vamos a tener que utilizar los servicios de interoperabilidad utilizando el espacio de nombres como

using System.Runtime.InteropServices;

El siguiente paso sería definir los mensajes que se encargará de mover el formulario. Tendremos estos como variables miembro de clase

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();

y, finalmente, vamos a escribir el código para enviar el mensaje cada vez que el usuario pulsa el botón del ratón. El formulario será reposicionado como por el movimiento del ratón si el usuario mantenga el botón del ratón.

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    ReleaseCapture();
    SendMessage(this.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0); 
}

Consulte este enlace Dragable formar

Rahul-rajat-Singh

mousedownpoint Point = Point.Empty;

    private void Form_MouseDown(object sender, MouseEventArgs e)
    {
        mousedownpoint = new Point(e.X, e.Y);
    }

    private void Form_MouseMove(object sender, MouseEventArgs e)
    {

        if (mousedownpoint.IsEmpty)
            return;
        Form f = sender as Form;
        f.Location = new Point(f.Location.X + (e.X - mousedownpoint.X), f.Location.Y + (e.Y - mousedownpoint.Y));

    }

    private void Form_MouseUp(object sender, MouseEventArgs e)
    {
        mousedownpoint = Point.Empty;
    }

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        Form_MouseDown(this, e);
    }

    private void panel1_MouseUp(object sender, MouseEventArgs e)
    {
        Form_MouseUp(this, e);
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        Form_MouseMove(this, e);
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top