Laden...

Rectangle mit MouseDown/MouseClick Ereignis erstellen

Erstellt von youngSTAR vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.551 Views
Y
youngSTAR Themenstarter:in
17 Beiträge seit 2009
vor 14 Jahren
Rectangle mit MouseDown/MouseClick Ereignis erstellen

Guten Morgen 😃

Kann mir wer helfen/erklären, wie man ein "MouseDown/MouseClick/etc" Ereignis programmiert?

Ich brauche für ein Projekt die Eigenschaft, das ich meine Rectangles verschieben kann. Also dachte ich mir über "MouseDown" und "MouseUp" könnte dies Funktionieren. Doch "Rectangle" ist ja keine Klasse, und man kann sie nicht vererben, und "umprogrammieren".

Danke

916 Beiträge seit 2008
vor 14 Jahren

Du kannst dir ja eine eigene Rectangle Klasse erstellen. Die enthält halt ein paar Daten wie Höhe, Länge und obere linke Ecke. Dann noch ein flag ob sie gerade dedrückt ist oder nicht.

Dann machst du dir einfach eine Liste all deiner Rectangle Objecte und bei einem MouseDown Event suchst du einfach alle Rectangles durch die diesen Punkt enthalten und setzt dort dann das Flag. Wenn nun ein MouseMove event kommt, dann einfach alle Rectangles die das Flag gesetzt haben um den Diff(x,y) verschieben. Wenn MouseUp kommt dann alle Flags zurück setzen.

Schau dir mal MouseUp MouseDown und MouseMove an einem Control an.
MSDN

Again what learned...

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo youngSTAR,

Ich brauche für ein Projekt die Eigenschaft, das ich meine Rectangles verschieben kann.

siehe [Artikel] Zeichnen in Windows-Programmen

Kann mir wer helfen/erklären, wie man ein "MouseDown/MouseClick/etc" Ereignis programmiert?

Das fällt nun ganz klar unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore

Y
youngSTAR Themenstarter:in
17 Beiträge seit 2009
vor 14 Jahren

herbivore, du verstehst mich falsch, oder ich habe mich falsch ausgedrückt.

 
foreach(Rectangle element in elements){
if (e.X > element.Posx && e.Y > element.Posy && (element.Posx + element.Width) > e.X && (element.Posy + element.Height) > e.Y)
                {
                    _selection = element;
                    posX = e.X - _selection.Posx;
                    posY = e.Y - _selection.Posy;

                    _selectedRectangle = true;
                    return;
                }
}

wie man Zeichnet, dass weiss ich. Auch wie man die Rectangles etc verschiebt, alles Kein Problem.

ich habe nur mühe mit dem "MouseDown","MouseMove","MouseUp". Wenn das wirklich in die Grundlagen gehört, dann zeigt mir wo ich das finde, wie man dies bestimmt.
Ich habe gesucht, und nichts gefunden.

Vom link der rollerfreak2 (thx!) geposted hat, konnte ich nur folgende zeile entnehmeN:

public event MouseEventHandler MouseDown;

also habe ich in meiner Klasse zwar ein "MouseDown"-Ereigniss, doch es heisst nur so, aber reagiert nicht auf ein physisches MouseDown.

Verstanden?^^

Danke

916 Beiträge seit 2008
vor 14 Jahren

Nein nicht wirklich.

Leg dir eine Form an, und dann fügst du einen EventHandler hinzu den du an das MouseDown event bindest.


form.MouseDown += new System.Windows.Forms.MouseEventHandler(MouseDownMethod);

void MouseDownMethod(object sender, System.Windows.Forms.MouseEventArgs e)
{
        throw new NotImplementedException();
}

Wenn du nun in der Form die Mouse drückst, und den debugger anhast und einen BreakPoint in der MouseDownMethod hast, dann landest du darin.

Verstanden?

Again what learned...

M
231 Beiträge seit 2007
vor 14 Jahren

Es kommt einfach drauf an wie du das Zeug zeichnest.

Wenn es immer Rechtecke sind, würde ich ein User Control bauen und von diesem den MouseDown abonieren.

Ansonsten kommt es eben drauf an auf was du zeichnest und von dort den MouseDown abonieren und dort schauen ob das Rec drunter liegt...

So denn,

Gruß MB


Gruß MB

Home of DigiJay - DJ-Freeware

Y
youngSTAR Themenstarter:in
17 Beiträge seit 2009
vor 14 Jahren

Wenn du nun in der Form die Mouse drückst, und den debugger anhast und einen BreakPoint in der MouseDownMethod hast, dann landest du darin.

Verstanden?

genau hier ist ja das problem:


form.MouseDown += new System.Windows.Forms.MouseEventHandler(MouseDownMethod);

form HAT die Ereignisse. Rectangle nicht.

ich möchte das die Rectangle auf ein Mausklick reagieren, und das via Ereignisse.

916 Beiträge seit 2008
vor 14 Jahren

Dann mach das was muntablues gesagt hat.
Leite von control ab, überschreib dort das OnPaint und häng dich da an die Event handler.

Again what learned...

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo youngSTAR,

ich wollte oben eigentlich diesen Link posten: [Tutorial] Gezeichnete Objekte mit der Maus verschieben

Ein Control für die Rectangles zu erstellen, wie von meinen Vorpostern geraten, kann ich nicht empfehlen. Insbesondere bei vielen Rectangles kann das zu Performance-Problemen führen.

herbivore

M
231 Beiträge seit 2007
vor 14 Jahren

@ herbivore

Dass die Performance schlecht wird ist mir auch klar, wenn es viele sind. Aber das kann man nirgends herauslesen. Wenn es nur ein paar Rects sind ist das Control sicher das einfachste, oder nicht?!?

Gruß MB


Gruß MB

Home of DigiJay - DJ-Freeware

2.760 Beiträge seit 2006
vor 14 Jahren

Wenn es nur ein paar Rects sind ist das Control sicher das einfachste, oder nicht?!?

Auf den ersten Blick mag das sein. Aber du wirst mit sehr hoher Wahrscheinlichkeit bald auf Probleme (Überdeckende Controls (beispielsweise beim verbinden), Transparenz, Performance usw..) stoßen wenn du das mit Controls machst. Die sind einfach nicht dafür gedacht.

Wie es im Tutorial beschrieben ist ist es schon richtig.

Wenn es sowieso nur klein sein soll dann nimm halt einfach was bestehendes: z.B.: Eigenes GraphicObject (jaensen's Grundgerüst) (musst a bissal zusammenkramen, war nicht wirklich als snippet oder Komponente gedacht) oder wenns "ein bisschen" mehr sein darf: ProFormX (ist wohl aber für ein paar Rechtecke zu groß 😉 grundsätzlich dürftest du mit ein bisschen Suche im Forum, Codeproject oder Codeplex noch viel mehr finden.