2012-11-20 7 views
6

Ich habe ein WinForms-Projekt. Ich habe eine Tafel auf meinem Fenster. Ich möchte, dass dieses Fenster das Fenster verschieben kann, wenn der Benutzer darauf klickt und es dann zieht.Verschieben von Fenster durch Klicken und Ziehen auf ein Steuerelement

Wie kann ich das tun?

+1

Google sagt, dass dies ein Duplikat sein könnte: http://stackoverflow.com/questions/30184/winforms-click-drag-anywhere-in-the-form-zu-bewegen-es-als-wenn-geklickt-in-the-form – rie819

+2

Nein! Es ist nicht. Ich möchte nicht, dass der Benutzer das Fenster irgendwo im Formular verschieben kann. Ich will, dass der Benutzer in der Lage ist, das Fenster nur von 'panel1' zu steuern. – Victor

+2

Schauen Sie" Daniel Moth, Vista Glass "in Google nach. Ich weiß, sein Tutorial zeigt Ihnen eine Methode, mit der Sie dies tun können (es ist ein Win32-Aufruf). Auch das könnte von Interesse sein http://www.codeproject.com/Articles/55180/Extending-the-Non-Client-Area-in-Aero – series0ne

Antwort

15

Fügen Sie die folgenden declerations Ihrer Klasse:

public const int WM_NCLBUTTONDOWN = 0xA1; 
public const int HTCAPTION = 0x2; 

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

[DllImport("User32.dll")] 
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam); 

Setzen Sie diese in Ihrem Panel-MouseDown Veranstaltung:

private void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     ReleaseCapture(); 
     SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0); 
    } 
} 
+0

das funktioniert perfekt. ich danke dir sehr! – Victor

+0

Froh, dass es geholfen hat :) – Blachshma

+0

Ausgezeichnet! +1 vermeidet Abstraktionen, die versuchen, Cursorpositionen, Offsets usw. mathematisch zu berechnen ... aber nein, stattdessen läuft dieses Mans nur direkt in das Gebäude, holt die Eistüten und klopft in das Windows-Messaging-System. Nett! Vielen Dank. –

Verwandte Themen