none
Programmhintergrund als "Schiebeleiste" RRS feed

  • Frage

  • Ich habe bei meinem Dialog den Rahmen ausgeblendet. Nun wollte ich es so machen, das wenn der Benutzer versucht den Dialoghintergrund zu verschieben, entsprechend der Dialog verschoben wird. Auf dem Dialog befindet sich lediglich ein Label.

    Koopakiller - http://koopakiller.ko.ohost.de/
    Freitag, 16. Dezember 2011 15:33

Antworten

  • Hallo K.,

    Deine Erklärungen zu der "Schiebeleiste" sind zugegebenermaßen schon etwas mißverständlich.

    Ich nehme aber an, dass Du das Formular durch Klicken und Ziehen im Nicht-Client-Bereich (nonclient area) verschieben möchtest.
    Dazu muss man über Interop die Windows API bemühen. Hier ein einfaches Beispiel:

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1 {
        public partial class Form1 : Form {
            public Form1() {
                InitializeComponent();
            }
    
            private void Form1_MouseDown(object sender, MouseEventArgs e) {
                NativeMethods.DoNonClientAreaDragging(this.Handle);
            }
        }
    
        class NativeMethods {
            [DllImportAttribute("user32.dll")]
            private static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);
            [DllImportAttribute("user32.dll")]
            private static extern bool ReleaseCapture();
    
            private const int WM_NCLBUTTONDOWN = 0xa1;
            private const int HT_CAPTION = 0x2;
    
            public static void DoNonClientAreaDragging(IntPtr hwnd) {
                ReleaseCapture();
                SendMessage(hwnd, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
            }
        }
    }
    


    Die Methode NativeMethods.DoNonClientAreaDragging basiert auf einen kleinen Trick: Wir können nicht einfach nur SendMessage aufrufen, da die WM_NCLBUTTONDOWN-Nachricht (s. Dokumentation unten) nur dann gepostet wird, wenn die Maus noch nicht vom Fenster "eingefangen" wurde. Da dies aber automatisch passiert, müssen wir im Code selbst dafür sorgen, dass über ReleaseCapture() die Maus wieder freigegeben wird.

    WM_NCLBUTTONDOWN message:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms645620(v=vs.85).aspx

    ReleaseCapture function:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms646261(v=vs.85).aspx

    SendMessage function:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx


    Gruß
    Marcel

    • Als Antwort markiert KK Senior Dienstag, 20. Dezember 2011 18:42
    Dienstag, 20. Dezember 2011 16:06
    Moderator

Alle Antworten

  • Hallo K.,

    Deine Erklärungen zu der "Schiebeleiste" sind zugegebenermaßen schon etwas mißverständlich.

    Ich nehme aber an, dass Du das Formular durch Klicken und Ziehen im Nicht-Client-Bereich (nonclient area) verschieben möchtest.
    Dazu muss man über Interop die Windows API bemühen. Hier ein einfaches Beispiel:

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1 {
        public partial class Form1 : Form {
            public Form1() {
                InitializeComponent();
            }
    
            private void Form1_MouseDown(object sender, MouseEventArgs e) {
                NativeMethods.DoNonClientAreaDragging(this.Handle);
            }
        }
    
        class NativeMethods {
            [DllImportAttribute("user32.dll")]
            private static extern int SendMessage(IntPtr hwnd, int msg, int wparam, int lparam);
            [DllImportAttribute("user32.dll")]
            private static extern bool ReleaseCapture();
    
            private const int WM_NCLBUTTONDOWN = 0xa1;
            private const int HT_CAPTION = 0x2;
    
            public static void DoNonClientAreaDragging(IntPtr hwnd) {
                ReleaseCapture();
                SendMessage(hwnd, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
            }
        }
    }
    


    Die Methode NativeMethods.DoNonClientAreaDragging basiert auf einen kleinen Trick: Wir können nicht einfach nur SendMessage aufrufen, da die WM_NCLBUTTONDOWN-Nachricht (s. Dokumentation unten) nur dann gepostet wird, wenn die Maus noch nicht vom Fenster "eingefangen" wurde. Da dies aber automatisch passiert, müssen wir im Code selbst dafür sorgen, dass über ReleaseCapture() die Maus wieder freigegeben wird.

    WM_NCLBUTTONDOWN message:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms645620(v=vs.85).aspx

    ReleaseCapture function:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms646261(v=vs.85).aspx

    SendMessage function:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx


    Gruß
    Marcel

    • Als Antwort markiert KK Senior Dienstag, 20. Dezember 2011 18:42
    Dienstag, 20. Dezember 2011 16:06
    Moderator
  • Danke das war, das was ich gesucht habe.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    Koopakiller - http://koopakiller.ko.ohost.de/
    Dienstag, 20. Dezember 2011 18:43