2009-08-06 13 views
14

Usando 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.aspxCómo mover un formulario de Windows cuando su propiedad FormBorderStyle está establecida en None?

Funciona siempre y cuando no me puse como FormBorderStyleNone.

¿Hay alguna manera de hacerlo funcionar con este conjunto de propiedades como None?

+0

Funciona para mí con FormBorderStyle establecido en Ninguno. Esto es en Server 2008, VS2008 con .NET 3.5. ¿En qué versión de .NET y sistema operativo estás? –

+0

@Michael McCloskey - Estoy usando Windows 7 rc, vs2008 con .net 3.5. – Moon

+0

@Michael McClosKey - ¡no importa! ahora funciona. No sé lo que pasó. – Moon

Respuesta

36

Sé que esta pregunta tiene más de un año, pero estaba tratando de recordar cómo lo hice en el pasado. Entonces, para la referencia de cualquier otra persona, la forma más rápida y menos compleja que el enlace anterior es 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á que cualquier formulario se mueva haciendo clic y arrastrando dentro del área del cliente.

+0

puede explicar esto un poco – masfenix

+0

Agregó algunos detalles sobre lo que hace – LizB

+0

¿por qué no puedo arrastrar el formulario cuando el evento mousedown está en menuStrip? – CMA

35

Aquí está la mejor manera que he encontrado. Es una "forma .NET", sin usar WndProc. Solo tiene que manejar los eventos MouseDown, MouseMove y MouseUp de las superficies que desea que se puedan arrastrar.

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

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

using System.Runtime.InteropServices; 

Lo siguiente 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 se volverá a colocar según el movimiento del mouse si el usuario mantiene presionado el botón del mouse.

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

Consulte este enlace Dragable form

Créditos a rahul-rajat-singh

1

que tenía la misma pregunta hace un tiempo y durante la búsqueda de la respuesta que se encuentra el código de abajo (no recuerdo el sitio web) y Esto 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; 
    } 
Cuestiones relacionadas