Frage

Ich habe eine Situation, in der ich ein Windows -Formular verschieben möchte, indem ich den rechten Maustaste auf seinem Client -Bereich hält. Die Form, die es begrenzt ist, wie ich gesagt habe.

Ich möchte es "nativ" bewegen (wenn möglich, sonst sind auch andere Antworten in Ordnung). Ich meine, die Art und Weise, wie es sich verhält, wenn Sie die linke Maustaste auf der Titelbank halten (mit Maus-Move und solchen Dingen bekomme ich viele seltsame Verhaltensweisen, aber vielleicht bin es nur ich).

Ich habe viele Dinge herumgelesen und dieser Beitrag sieht hilfreich aus

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

Ich versuchte verschiedene Möglichkeiten, das zu nutzen, und sah durch http://msdn.microsoft.com/en-us/library/ff468877%28v=vs.85%29.aspx Um andere nützliche Dinge zu finden, und wm_ncrbuttondown kam mir in den Sinn.

Jeder Vorschlag wird geschätzt, danke

Francesco

War es hilfreich?

Lösung

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

Andere Tipps

Sie benötigen zwei P/Invoke -Methoden, um dies zu erledigen.

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

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

Ein paar Konstanten:

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

Umgehen MouseDown Ereignis in Ihrem Formular, dann tun Sie Folgendes:

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

Dadurch wird Ihrem Formular das gleiche Ereignis gesendet, das er erhält, wenn die Maus klickt und den Bildunterschriftsbereich hält. Bewegen Sie die Maus und das Fenster bewegt sich. Wenn Sie die Maustaste loslassen, stoppt die Bewegung. Sehr leicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top