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
hast schon versucht hier im forum zu suchen?
drag and drop eines contols...
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 😉
@Just-Ben: Hast du den Link mal angeguckt?
@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
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...
du kannst "alten WinApi" auch unter C# nutzen. Sieh dazu die DllImportAtributte-Klasse an.
Wow das war ja ne schnelle Antwort.
Wenns geht wollte ich das Benutzen der alten API eigendlich umgehen.
Trotzdem Danke...
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