Drag&Drop mit ImageList
-
Hallo,
ich möchte eine Drag&Drop Operation implementieren. Dabei soll ein Bild beim verschieben angezeigt werden. Dazu habe ich ein eigenes DragObject von TDragControlObject abgeleitet und dort die Methode GetDragImages überschrieben, so daß sie das korrekte Bild zurückgibt.
Also Control habe ich dort das Control angegeben von dem aus gezogen wird.
Jetzt habe ich allerdings das Problem, daß das Bild nur außerhalb des angegeben Controls angezeigt wird. Ich möchte aber vor allem innerhalb dieses Controls draggen (und droppen ;)). Was kann ich jetzt machen? Irgendwo außerhalb noch ein unsichtbares kleines Control hinsetzen und das angeben? Sieht für mich wie ein Hack aus...Ein weiteres Problem ist, ich würde gerne Einfluß darauf nehmen, wo das Bild genau positioniert wird. Und zwar würde ich es gerne auf dem Control wo ich ziehe nur an z.B. durch 8 teilbaren Pixelpositionen anzeigen.
Gibts da irgendwie ne günstige Möglichkeit?Achja, vielleicht wichtig: Ich arbeite mit BCB4.
Vielen Danke schonmal für jede Hilfe
Jester
-
*push*
-
Jester,
Jester schrieb:
...daß das Bild nur außerhalb des angegeben Controls angezeigt wird.
wie das Formular selbst, braucht auch jedes Control, in das gedroppt werden soll, die Style-Eigenschaft csDisplayDragImage:
ctrl->ControlStyle = ctrl->ControlStyle << csDisplayDragImage;
Hier ist ein gutes Tutorial dafür (abgesehen davon, daß das Delphi-Code ist): http://www.blong.com/Conferences/BorCon2001/DragAndDrop/4114.htm#WhatADrag
Jester schrieb:
...nur an z.B. durch 8 teilbaren Pixelpositionen anzeigen.
z.B. so:
X = X - X % 8; Y = Y - Y % 8; if (X < 0) { X = 0; } if (Y < 0) { Y = 0; }
Das läßt sich natürlich noch apassen. Z.B. könnte man eine Rundung implementieren, die das Bild immer auf die nächst gelegenen durch 8 teilbaren Positionen schnipsen läßt ...
-
Vielen Dank!
Werd das mit dem ControlStyle nachher mal ausprobieren... aber hört sich plausibel an.Das mit dem runden war mir schon klar. Die Frage ist, wie setze ich das technisch um. Muß ich das über ändern des HotSpots in OnMouseMove machen, oder gibt's ne einfachere/bessere Möglichkeit?
MfG Jester
-
Jester,
Jester schrieb:
Muß ich das über ändern des HotSpots in OnMouseMove machen
ich bin nicht ganz sicher, was Du meinst. Das OnDragDrop-Ereignis liefert Dir doch die exakten Koordinaten.
-
Ah, Mißverständnis:
Ich möchte das DragImage immer nur an den "zulässigen" Positionen zeigen.
MfG Jester
-
Jester schrieb:
Ich möchte das DragImage immer nur an den "zulässigen" Positionen zeigen.
Ach so, also eine Art snap-to-grid. Die dafür in Frage kommende Funktion ist TDragImageList::SetDragImage, da sie den HotSpot setzt. Allerdings hat sie offenbar keine Wirkung bei einer laufenden Drag&Drop-Aktion. Wenn das stimmt, kommst Du um Handarbeit wohl nicht herum: entweder das Drag-Image komplett selbst zeichnen oder ein Hilfs-Rechteck (transparentes TShape oder so) als Positions-Anzeiger verwenden (wie im Form-Designer des CBuilders).
-
Jo, das hatte ich schon gefunden. Es funktioniert tatsächlich nicht während der Drag-Operation. Das mit der TShape hört sich eigentlich ganz schlau an, ist mir jetzt aber zu viel Arbeit, da gibt's erstmal wichtigere Sachen zu erledigen. Dann Springt es halt vorerst beim Ablegen an den richtigen Platz.
Vielen Dank für Deine Hilfe!