Laden...

HowTo - Windows-Form ohne Rahmen und Titelleiste verschieben

Erstellt von Xzelsius vor 13 Jahren Letzter Beitrag vor 13 Jahren 10.841 Views
X
Xzelsius Themenstarter:in
92 Beiträge seit 2008
vor 13 Jahren
HowTo - Windows-Form ohne Rahmen und Titelleiste verschieben

Beschreibung:

Du hast eine Windows-Form ohne Rahmen und ohne Titelleiste und willst diese aber trotzdem verschieben können?

Hier die Lösung dazu [Code ist selbsterklärend wegen Kommentaren]:


// Events setzen
this.MouseMove += new MouseEventHandler(this.FormMouseMove);
this.MouseDown += new MouseEventHandler(this.FormMouseDown);

#region Handler für das Verschieben der Form
/// <summary>
/// Maus-Position im Bildschirm
/// </summary>
private Point mousePosition;

/// <summary>
/// Verarbeitet das MouseDown-Event
/// </summary>
/// <param name="sender">Sender</param>
/// <param name="e">Mouse-Event Argumente</param>
private void FormMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
this.mousePosition = new Point(-e.X, -e.Y);
}

/// <summary>
/// Verarbeitet das MouseMove-Event
/// </summary>
/// <param name="sender">Sender</param>
/// <param name="e">Mouse-Event Argumente</param>
private void FormMouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
// Wenn der Linke Button gedrückt ist
if (e.Button == MouseButtons.Left)
{
// Maus-Position auf dem Control
Point mousePos = Control.MousePosition;

// Verschiebt den Punkt um den angegebenden Betrag
mousePos.Offset(this.mousePosition.X, this.mousePosition.Y);

// Neue Position setzen
this.Location = mousePos;
}
}
#endregion

Schlagwörter: Form, Titelleiste, Verschieben

public Knowledge Learn_CSharp();

3.825 Beiträge seit 2006
vor 13 Jahren

Super ! Danke !

Bau ich gleich mal in meine selbstgebauten Message-Boxen ein.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

Z
403 Beiträge seit 2007
vor 13 Jahren

Hey, hab deinen Code mal in eine Klasse verpackt.
Abgesehen davon, dass ich Englischsprachige Konstruktor-Kommentare habe sollte es auch selbsterklärend sein 😃

using System;
using System.Windows.Forms;
using System.Drawing;

namespace DynamicControls
{
    public class ControlDrag
    {
        /// <summary>
        /// Drags the control within it's client base
        /// </summary>
        /// <param name="client">client where the control is in, like a panel or a form</param>
        /// <param name="control">the control to drag</param>
        /// <param name="enabled">determines whether the dragging is enabled</param>
        /// <param name="cursorEnabled">determines whether the "size all" cursor is enabled</param>
        public ControlDrag(Control client, Control control, Boolean enabled, Boolean cursorEnabled)
        {
            this.Enabled = enabled;
            this.CursorEnabled = cursorEnabled;
            this.client = client;
            this.control = control;
            control.MouseDown += new MouseEventHandler(control_MouseDown);
            control.MouseMove += new MouseEventHandler(control_MouseMove);
        }


        /// <summary>
        /// Drags the control without a client base, for example a form
        /// </summary>
        /// <param name="control">the control/form to drag</param>
        public ControlDrag(Control control)
            : this(null, control,false,false)
        { }

        Control control;
        Control client;

        Boolean enabled = false;

        public Boolean Enabled
        {
            get { return enabled; }
            set { enabled = value; }
        }

        Boolean cursorEnabled = false;

        public Boolean CursorEnabled
        {
            get { return cursorEnabled; }
            set { cursorEnabled = value; }
        }

        private Point mousePosition;

        void control_MouseDown(object sender, MouseEventArgs e)
        {
            if (Enabled)
            {
                this.mousePosition = new Point(-e.X, -e.Y);
            }
        }

        void control_MouseMove(object sender, MouseEventArgs e)
        {
            if (Enabled)
            {
                // Wenn der Linke Button gedrückt ist
                if (e.Button == MouseButtons.Left)
                {
                    // Maus-Position auf dem Control
                    // 
                    Point mousePos;

                    if (client != null)
                    {
                        mousePos = client.PointToClient(Control.MousePosition);
                    }
                    else
                    {
                        mousePos = Control.MousePosition;
                        //mousePos.Y -= 30; // Windows offset
                    }

                    // Verschiebt den Punkt um den angegebenden Betrag
                    mousePos.Offset(this.mousePosition.X, this.mousePosition.Y);

                    // Neue Position setzen
                    control.Location = mousePos;
                }
                if (CursorEnabled)
                {
                    Cursor.Current = Cursors.SizeAll;
                }
            }
        }
    }
}


Hier ein Anwendungsbeispiel

using System;
using System.Windows.Forms;

namespace DynamicControls
{
    public partial class Form1 : Form
    {
        ControlDrag dragForm;

        public Form1()
        {
            InitializeComponent();
            dragForm = new ControlDrag(this);
            ControlDrag dragButton = new ControlDrag(this, button1,true,true);
            ControlDrag dragRtb = new ControlDrag(this, richTextBox1, true,true);
        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            dragForm.Enabled = checkBox1.Checked;
            dragForm.CursorEnabled = checkBox1.Checked;
        }
    }
}

Wie man sieht sehr einfach zu benutzen 😃

Anhand dessen lässt sich bestimmt relativ einfach ein kleiner Editor erstellen, damit der User sich das UI selber anpassen kann.

W
198 Beiträge seit 2008
vor 13 Jahren

Das geht auch deutlich einfacher:


protected override void WndProc(ref Message msg)
{
    if (msg.Msg == 0x84) // WM_NCHITTEST
       msg.Result = (IntPtr)0x02;  // HTCAPTION
    else
       base.WndProc(ref msg);
}

Gruß,

wcseller

X
Xzelsius Themenstarter:in
92 Beiträge seit 2008
vor 13 Jahren

Das geht auch deutlich einfacher

Also deines zu verstehen ist ein bisschen schwieriger als meins. Also rein von dem her 😉 Ich wollte jemand einen einfachen, gut zu verstehenden weg geben 😉


protected override void WndProc(ref Message msg)
{
if (msg.Msg == 0x84) // WM_NCHITTEST
msg.Result = (IntPtr)0x02; // HTCAPTION
else
base.WndProc(ref msg);
}

Dazu sag ich nur: Meins läuft sicher stabiler 😉 Da ich mei bir nur die Form verschiebe und nicht das Ereignis blockiere, bzw. manipuliere 😉

public Knowledge Learn_CSharp();