Wie kann ich ein Windows -Formular verschieben, wenn seine FormborderSyle -Eigenschaft auf keine festgelegt ist?

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

  •  12-09-2019
  •  | 
  •  

Frage

Mit C#.
Ich versuche a zu bewegen Form Ohne ihre Titelbar.
Ich habe einen Artikel darüber gefunden über: http://www.codeprroject.com/kb/cs/csharpmovewindow.aspx

Es funktioniert, solange ich nicht setze FormBorderStyle wie None.

Gibt es eine Möglichkeit, es mit dieser Eigenschaft zu arbeiten, als None?

War es hilfreich?

Lösung

Ich weiß, dass diese Frage über ein Jahr alt ist, aber ich habe versucht, mich daran zu erinnern, wie ich es in der Vergangenheit gemacht habe. Für die Referenz anderer anderer ist der obige Link die schnellste und weniger komplexe Art und Weise, die WndProc -Funktion zu überschreiben.

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

Dadurch kann jedes Formular durch Klicken und Ziehen im Kundenbereich verschoben werden.

Andere Tipps

Hier ist es der beste Weg, den ich gefunden habe. Es ist ein ".NET Way", ohne WndProc. Sie müssen nur die Mousedown-, Mousemove- und MouseUp -Ereignisse der Oberflächen, die Sie dragzieren möchten, bewältigen.

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

Ich hatte vor einiger Zeit die gleiche Frage und als ich nach der Antwort suchte, fand ich den Code unten (erinnere dich nicht an die Website) und hier ist, was ich tue:

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

Zuerst müssen wir die Interop -Dienste verwenden, indem wir den Namespace als verwenden

using System.Runtime.InteropServices;

Das nächste wäre, die Nachrichten zu definieren, die sich um das Verschieben des Formulars kümmern. Wir werden diese als Klassenmitgliedvariablen haben

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

Und schließlich schreiben wir den Code, um die Nachricht zu senden, wenn der Benutzer die Maustaste drückt. Das Formular wird gemäß der Mausbewegung neu positioniert, wenn der Benutzer die Maustaste drückt.

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

Siehe diesen Link Dragbare Form

Anerkennung an 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);
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top