Laden...

UserControl per MouseDown verschieben?

Erstellt von michback20 vor 19 Jahren Letzter Beitrag vor 19 Jahren 3.994 Views
M
michback20 Themenstarter:in
13 Beiträge seit 2004
vor 19 Jahren
UserControl per MouseDown verschieben?

Hallo,

ich habe ein Programm geschrieben, bei dem der Benutzer ein Button drückt und dann entsteht ein UserContol. Dieser UserControl soll dann aber noch von dem Benutzer frei verschiebbar sein.
Folgenden Code habe ich schon geschrieben, mit fehlt der Inhalt der If-Anweisung. Kennt jemand den passenden Code, der es ermöglicht, den UserControl frei beweglich zu machen, wenn man auf ihn die linke Maustaste drückt?

Code C#

...
{
...
this.MouseDown += new System.WinForms.MouseEventHandler (this.UnserControl_MouseDown);
...
}

....

private void UserControl_MouseDown(object sender, System.WinForms.MouseEventArgs e)
{
if(e.Button == MouseButtons.Left)
{
????????????????????????????
}

}

Gruß Michael

X
2.051 Beiträge seit 2004
vor 19 Jahren

hast schon versucht hier im forum zu suchen?
drag and drop eines contols...

J
60 Beiträge seit 2004
vor 19 Jahren

Naja da braucht es ja eigentlich kein Drag N Drop

Wenn dieser Code in der zu verschiebenden UserControl steht merke dir beim MouseDown event die Position der Mouse (Control.MousePosition runterechnen)

Beim MouseMove event verschiebe die Control einfach mit 😉

Ist nicht alzuschwierig, habe ich auch schon gemacht.

Der Nachteil von D n D wäre hier das auch andere Applicationen es Empfangen könnten, wäre aber sicher leichter zu implementieren.

MFG

Ben

Das wirklich freie C# Buch für Programmieranfänger auf Wikibooks, auch du kannst helfen 😉

X
2.051 Beiträge seit 2004
vor 19 Jahren

@Just-Ben: Hast du den Link mal angeguckt?

M
michback20 Themenstarter:in
13 Beiträge seit 2004
vor 19 Jahren

@Xqgene: Danke, ich hatte das eigentlich nicht per Drag n Drop vor, aber das ist noch viel besser,....mit ein wenig ausprobieren hat es nun geklappt🙂

Danke

Gruß Michael

K
64 Beiträge seit 2004
vor 19 Jahren

Hallo.

Ich hab hier das gleiche Problem und war froh, dass ich bei diesem Thema hier gleich fündig geworden bin.
Mein Control lässt sich jetzt auch super verschieben.
Nun möchte ich aber noch zusätzlich das Control über einem anderen Control "loslassen". (ähnlich Drag n Drop) Momentan bleibt dann das verschiebbare Control über dem anderen stehen.
Gibts vielleicht irgend ein Event welches ausgelös wird, wenn ein Control ganz oder teilweise von einem anderen verdeckt wird?
Ich meine bei der "alten" Win API gabs sone Funktion.

Danke schon mal...

X
2.051 Beiträge seit 2004
vor 19 Jahren

du kannst "alten WinApi" auch unter C# nutzen. Sieh dazu die DllImportAtributte-Klasse an.

K
64 Beiträge seit 2004
vor 19 Jahren

Wow das war ja ne schnelle Antwort.
Wenns geht wollte ich das Benutzen der alten API eigendlich umgehen.
Trotzdem Danke...

K
64 Beiträge seit 2004
vor 19 Jahren

Soa ich hab hier mal was gebastelt. Ich meine das sollte so funzen.
(Wenn jemand ne besse Lösung hat, bitte mal Posten)
Da ich mich immer so unverständlich ausdrücke hab ich mal n Codebeispiel geschrieben.
Wir haben hier n Hauptfenster in dem es ein Papier- und ein Mülleimer- Control gibt. Man kann das Papier- Control auf den Mülleimer ziehen damit es verschwindet.
Hier ham wa erst mal das Hauptfenster:


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

namespace Test {

	class Hauptfenster : Form {
		Papier papier;
		Mülleimer mülleimer;
		
		public Hauptfenster() {
			papier = new Papier();
			papier.Location = new Point(20,20);
			papier.MouseUp += new MouseEventHandler(Gedragt);
			Controls.Add(papier);
			mülleimer = new Mülleimer();
			mülleimer.Location = new Point(120,80);
			Controls.Add(mülleimer);
		}
		
		void Gedragt(object sender, MouseEventArgs e) {
			Rectangle papRect = papier.Bounds;
			Rectangle müllRect = mülleimer.Bounds;
			if(papRect.IntersectsWith(müllRect))
				Controls.Remove(papier);
		}
		
		public static void Main(string[] args) {
			Application.Run(new Hauptfenster());
		}
	}
}

Das Papier Control:


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

namespace Test {

	class Papier : Control {
		int mausPosX, mausPosY;
		bool mausGedrückt;
		
		public Papier() {
			Size = new Size(40,60);
			BackColor = Color.White;
		}
		
		protected override void OnMouseDown(MouseEventArgs e) {
			mausPosX = e.X;
			mausPosY = e.Y;
			mausGedrückt = true;
			base.OnMouseDown(e);
		}
		
		protected override void OnMouseUp(MouseEventArgs e) {
			mausGedrückt = false;
			base.OnMouseUp(e);
		}
		
		protected override void OnMouseMove(MouseEventArgs e) {
			if(mausGedrückt)
				Location = new Point(Left+e.X-mausPosX, Top+e.Y-mausPosY);
			base.OnMouseMove(e);
		}
	}
}

Und der Mülleimer:


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

namespace Test {

	class Mülleimer : Control {
		
		public Mülleimer() {
			Size = new Size(80,100);
			BackColor = Color.Red;
		}
	}
}

Das Ding steckt in der "IntersectsWith" - Methode. Hier wird controlliert, ob sich die Controls in irgend einer Weise überschneiden.

Bis denne ...
Kabaal