19 Stimmen

Wie kann ein Windows-Formular verschoben werden, wenn seine FormBorderStyle-Eigenschaft auf None gesetzt ist?

Mit C#.
Ich versuche, eine Form ohne seine Titelleiste.
Ich fand einen Artikel darüber auf: http://www.codeproject.com/KB/cs/csharpmovewindow.aspx

Es funktioniert, solange ich nicht die FormBorderStyle como None .

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

46voto

LizB Punkte 2133

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. Also für alle anderen Referenz, die schnellste und weniger komplexe Weise dann den obigen Link ist 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 innerhalb des Kundenbereichs verschoben werden.

41voto

cprcrack Punkte 15337

Hier ist der beste Weg, den ich gefunden habe. Es ist ein ".NET Weg", ohne WndProc zu verwenden. Sie müssen nur die MouseDown, MouseMove und MouseUp Ereignisse der Oberflächen, die Sie ziehen wollen, behandeln.

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

3voto

Ryu Punkte 181

Ich hatte die gleiche Frage vor einer Weile und während der Suche nach der Antwort fand ich den Code unten (erinnere mich nicht an die Website) und Hier ist, was ich tun:

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

0voto

thejustv Punkte 1951

Zunächst müssen wir die Interop-Dienste verwenden, indem wir den Namespace als

using System.Runtime.InteropServices;

Als Nächstes müssen die Nachrichten definiert werden, die für die Verschiebung des Formulars sorgen sollen. Wir werden diese als Klassenvariablen 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 werden wir den Code schreiben, um die Nachricht zu senden, wenn der Benutzer die Maustaste drückt. Das Formular wird entsprechend der Mausbewegung neu positioniert, wenn der Benutzer die Maustaste gedrückt hält.

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

Siehe diesen Link Ziehbares Formular

Kredite an rahul-rajat-singh

0voto

aya ali rayan Punkte 1

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X