Como mover um Windows Form quando sua propriedade FormBorderStyle está definida como None?

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

  •  12-09-2019
  •  | 
  •  

Pergunta

Usando C#.
Estou tentando mover um Form sem sua barra de título.
Encontrei um artigo sobre isso em: http://www.codeproject.com/KB/cs/csharpmovewindow.aspx

Funciona desde que eu não defina FormBorderStyle como None.

Existe uma maneira de fazê-lo funcionar com esta propriedade definida como None?

Foi útil?

Solução

Sei que essa pergunta tem mais de um ano, mas eu estava procurando tentando lembrar como fiz isso no passado. Portanto, para a referência de qualquer outra pessoa, a maneira mais rápida e menos complexa do que o link acima é substituir a função 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);
}

Isso permitirá que qualquer formulário seja movido clicando e arrastando dentro da área do cliente.

Outras dicas

Aqui é a melhor maneira que encontrei. É um ".NET Way", Wihout usando o WNDPROC. Você só precisa lidar com os eventos de Mousedown, Mousemove e MouseUp das superfícies que deseja ser arrastado.

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;
}

Eu tive a mesma pergunta há um tempo atrás e, enquanto procurava a resposta que encontrei no código abaixo (não me lembro do site) e aqui está o que faço:

    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;
    }

Primeiro teremos que usar os serviços de interoperabilidade usando o namespace como

using System.Runtime.InteropServices;

O próximo passo seria definir as mensagens que cuidarão da movimentação do formulário.Teremos isso como variáveis ​​​​de membro da classe

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();

e por fim escreveremos o código para enviar a mensagem sempre que o usuário pressionar o botão do mouse.O formulário será reposicionado conforme o movimento do mouse se o usuário mantiver o botão do mouse pressionado.

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

Consulte este link Formulário arrastável

Créditos para rahul-rajat-singh

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;
    }

    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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top