2009-08-06 8 views
14

Verwenden von C#. Ich versuche Form ohne seine Titelleiste zu verschieben.
fand ich einen Artikel darüber auf: http://www.codeproject.com/KB/cs/csharpmovewindow.aspxWie Verschieben eines Windows Form, wenn seine FormBorderStyle-Eigenschaft auf None festgelegt ist?

Es so lange funktioniert, wie ich nicht FormBorderStyle als None gesetzt haben.

Gibt es eine Möglichkeit, damit diese Eigenschaft als None eingestellt wird?

+0

Es funktioniert für mich mit FormBorderStyle auf None gesetzt. Dies ist auf Server 2008, VS2008 mit .NET 3.5. In welcher .NET-Version und auf welchem ​​Betriebssystem befinden Sie sich? –

+0

@Michael McCloskey - Ich benutze Windows 7 RC, vs2008 mit. NET 3.5. – Moon

+0

@Michael McClosKey - vergiss es! es funktioniert jetzt. Ich weiß nicht was passiert ist. – Moon

Antwort

36

Ich weiß, dass diese Frage über ein Jahr alt ist, aber ich habe versucht, mich zu erinnern, wie ich es in der Vergangenheit gemacht habe. Für die Referenz von irgendjemandem ist der schnellste und weniger komplexe Weg als der obige Link, 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 Clientbereichs verschoben werden.

+0

können Sie dies ein wenig erklären – masfenix

+0

Hinzugefügt einige Details darüber, was es tut – LizB

+0

Warum kann ich nicht ziehen Sie das Formular, wenn mousedown Ereignis ist auf menuStrip? – CMA

35

Hier ist es der beste Weg, den ich gefunden habe. Es ist ein ".NET Weg" ohne WndProc. Sie müssen nur die MouseDown-, MouseMove- und MouseUp-Ereignisse der Flächen behandeln, die Sie ziehbar machen möchten.

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

Zuerst werden wir die Interop-Dienste mithilfe des Namespace als

using System.Runtime.InteropServices; 

Das nächste, was wäre, um die Nachrichten zu definieren, nehmen Pflege der Bewegung der Form verwenden. Wir werden diese als Klassenelementvariablen

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 die Nachricht zu senden, wenn der Benutzer die Maustaste drückt. Das Formular wird gemäß 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 Link Dragable form

Credits rahul-rajat-singh

1

ich die gleiche Frage vor einer Weile hatte und während für die Antwort der Suche fand ich den Code unten (erinnern Sie sich nicht auf der Website) und Hier ist, was ich mache:

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