Pregunta

Tengo una situación en la que me gustaría mover un formulario de Windows manteniendo presionado el botón derecho del mouse en su área de cliente; La forma no tiene borde como he dicho.

Me gustaría moverlo "nativo" (si es posible, de lo contrario otras respuestas también están bien). Me refiero a la forma en que se comporta cuando mantienes el botón del mouse izquierdo en la barra de título (con mouse y cosas así, obtengo muchos comportamientos extraños, pero tal vez solo soy yo).

He leído muchas cosas y esta publicación parece útil.

http://social.msdn.microsoft.com/forums/en-us/csharpgeneral/thread/b9985b19-cab5-4fba-9dc5-f323d0d37e2f/

Intenté una forma de usar eso y observé a través de http://msdn.microsoft.com/en-us/library/ff468877%28v=vs.85%29.aspx Para encontrar otras cosas útiles y Wm_ncrButtondown vino en mi mente, sin embargo, el WNDProc no lo detecta, ¿tal vez porque está manejado por la forma?

Cualquier sugerencia es apreciada, gracias

Francesco

¿Fue útil?

Solución

public partial class DragForm : Form
{
    // Offset from upper left of form where mouse grabbed
    private Size? _mouseGrabOffset;

    public DragForm()
    {
        InitializeComponent();
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if( e.Button == System.Windows.Forms.MouseButtons.Right )
            _mouseGrabOffset = new Size(e.Location);

        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        _mouseGrabOffset = null;

        base.OnMouseUp(e);
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        if (_mouseGrabOffset.HasValue)
        {
            this.Location = Cursor.Position - _mouseGrabOffset.Value;
        }

        base.OnMouseMove(e);
    }
}

Otros consejos

Necesita dos métodos P/Invoke para hacer esto.

[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);

[DllImport("user32.dll")]
static extern bool ReleaseCapture();

Un par de constantes:

const int WmNcLButtonDown = 0xA1;
const int HtCaption= 2;

Manejar el MouseDown Evento en su formulario, luego haga esto:

private void Form_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        ReleaseCapture();
        SendMessage(this.Handle, WmNcLButtonDown, HtCaption, 0);
    }
}

Esto enviará a su formulario el mismo evento que recibe cuando el mouse haga clic y mantiene presionado el área de subtítulos. Mueva el mouse y la ventana se mueve. Cuando suelta el botón del mouse, el movimiento se detiene. Muy fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top