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();
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
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.
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
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();