Hilfe Grafik mit der Maus verschieben

mili

Grünschnabel
Hallo,

ich habe ein Problem (vb2005)! Ich möchte gerne Rechtecke in eine Form
zeichnen(kein Problem) aber ---- nun möchte ich eines(Zufällig) an eine
andere Position schieben (Maus), ein anderes an eine andere usw..
Habe schon viel über GDI gelesen ------ zwecklos - will nicht rein.

Wenn es möglich wäre hätte ich gerne einen nachvollziehbaren
Beispielcode.

Mit freundl. Grüßen
Emil
 

Cromon

Erfahrenes Mitglied
Der Titel ist jetzt nicht gerade optimal gewählt, "Hhhhhhhhhhhhhhhilfe" schreckt sehr ab das Thema zu öffnen.

Wie sieht denn dein Code soweit aus? Und warum verwendest du nicht die neuste Version von VB?

Wenn du pictureBoxes verwendest:
C#:
pictureBox1.Location = Mouse.Location;
 

mili

Grünschnabel
Hallo Cromon,
zunächst herzlichen Dank für Deine SCHNELLE Antwort "Super".
Zu Deine Fragen - höhere VS Versionen sind für mich momentan nicht erschwinglich.

Zum Code:
habe bisher nur einen Testbutton - Bitmaps auf die Form zeichnen
und quasi daselbe für Rechtecke.


Private Sub Button1_click(.....)

Dim bm as New Bitmap("")
Dim gr as graphics = graphics.fromHwnd(mybase.Handle)

gr.translateTransform()
gr.RotateTransform(45) ---- Test um das Bitmap/Rechteck zu drehen

gr.drawImage(bm, 100, 100) ---- zeichnen der Bitmap/Rechteck

end Sub


ich hoffe Du bist soweit einverstanden?

mfG
Emil
 

Steiner_B

Erfahrenes Mitglied
Hallo,

Vorweg mal: Bitte für Code auch immer einen Code-Bereich verwenden
Visual Basic:
Private Sub Button1_click(.....)

Dim bm as New Bitmap("")
Dim gr as graphics = graphics.fromHwnd(mybase.Handle)

gr.translateTransform()
gr.RotateTransform(45) ---- Test um das Bitmap/Rechteck zu drehen

gr.drawImage(bm, 100, 100) ---- zeichnen der Bitmap/Rechteck

end Sub

Für Drag&Drop Funktionalität ist folgendes zu implementieren:

  • Im MouseDown Handler des Steuerelements auf dem du zeichnest:
    Abfragen ob die Maus über einem deiner Grafikelemente ist, wenn ja merken über welchem
  • Im MouseMove:
    Wenn im MouseDown ein Steuerelement gemerkt wurde -> dieses um die Mausbewegung verschieben.
  • Im MouseUp:
    Merken des Grafikelements beenden.
 

mili

Grünschnabel
Hallo,

Danke Dir für dEINE Antwort.

Ich denke mein Hauptproblem liegt darin zu erkennen wie ein Grafikobject unter der
Maus erkannt werden soll!
Bei Steuerelementen ist das kein Problem Sie haben einen eindeutigen Namen z.B.:
(Button1, Label1 ... x) und konnen problemlos mit (me.Controls(CType(sender, button)...)
abgefragt bez. identifiziert werden.

Ich denke ich brauche was das Problem betrifft genaue - nachvollziehbare Erklärungen
mit script-Beispielen: daß ich es nachvollziehen kann.

mfg
Emil
 

Cromon

Erfahrenes Mitglied
Du musst einfach die Position der einzelnen Graphikelemente irgendwo speichern. Dazu bieten sich die diversen Container von .NET recht gut an.
 

Steiner_B

Erfahrenes Mitglied
Für selbst gezeichnete Objekte gibt es keine vorhandene Möglichkeit um sowas zu überprüfen. Das musst du schon selber machen.

Ich würde mir z.B.: alle Objekte die ich zeichne in einem Array speichern, und dann je nachdem was für Elemente ich gezeichnet habe eine Funktion implementieren die dir sagen kann ob ein Punkt innerhalb eines Objektes liegt.

Edit:// Wenn du die Objekte rotierst wird das nicht ganz trivial werden.
 

Shakie

Erfahrenes Mitglied
Die GraphicsPath-Klasse kann dir da eine Menge Arbeit bezüglich Kollisionsabfrage abnehmen. Mit der IsVisible-Methode kannst du überprüfen ob ein Punkt innerhalb der geometrischen Form liegt, welche durch das GraphicsPath-Objekt definiert wurde.
 
Zuletzt bearbeitet:
M

Maxi

Ich hatte mal das gleiche problem mit pictureboxen
ich habe dan eine variable z.B. "auswahl" deffiniert

und dann bei bicturebox mouse hover? oder so halt wenn die maus überm object ist
auswahl = object name

und bei mouse down
wenn auswahl = object name
dann: objekt position x = objekt position x + mousepositions änderung x
objekt position y = objekt position y + mousepositions änderung y


bei maus überm hintergrund noch
auswahl = ""


bin mir net sicher obs hilft

Ps: änderung = neue position - alte position
also musst du die alte kennen (variable)