|
Wird die linke Maustaste losgelassen, muß zunächst überprüft werden, ob ein Ziehvorgang zu bearbeiten ist. Falls nicht, wird die geerbte Methode aufgerufen und die Funktion beendet:
void TDragListBox::EvLButtonUp (
uint modKeys, TPoint & pt)
{
if (!MouseDown)
{
TListBox::EvLButtonUp(modKeys, pt);
return;
}
Im Falle eines aktiven Ziehvorgangs wird zunächst das Flag MouseDown zurückgesetzt und die Bewegungsbeschränkung der Maus aufgehoben:
MouseDown = false;
ReleaseCapture();
ClipCursor(NULL);
Anschließend kann die neue Position des selektierten Eintrags bestimmt werden:
int newPosition = (pt.y / Height + CurrentTop);
int entries = GetCount();
if (newPosition == entries)
newPosition = -1;
Das Verschieben des selektierten Eintrags erfolgt durch Löschen des Eintrags an seiner aktuellen Position und einem Wiedereinfügen an der Zielposition. Dazu muß der Eintrag temporär zwischengespeichert werden, da die Listbox über keine Möglichkeit zur Zwischenspeicherung oder gar Indexänderung verfügt:
char buf[256];
GetString(buf, CurrentSelection);
DeleteString(CurrentSelection);
int result = InsertString(buf, newPosition);
SetSelIndex(result);
Abschließend wird die geerbte Methode EvLButtonUp aufgerufen:
TListBox::EvLButtonUp(modKeys, pt);
}
Erweiterungen
Für die vorgestellte Lösung sind diverse Erweiterungen denkbar. So könnte beispielsweise das Drag&Drop auf mehrere Einträge erweitert werden. Dazu müßten in der Methode EvLButtonUp die Einträge in einer Schleife verschoben werden, indem die selektierten Einträge nacheinander über das beschriebene Löschen und Wiedereinfügen umplaziert werden. Allerdings sind dabei erweiterte Bedingungen beim Selektieren und Bestimmen der neuen Position zu beachten.
Was die vorgestellte Lösung ebenfalls nicht berücksichtigt, sind benutzergezeichnete Einträge. Die Klasse TDragListBox setzt voraus, daß es sich bei den Einträgen um Strings handelt.
Mit der vorgestellten Klasse TDragListBox liegt jedoch eine Musterlösung vor, die mit wenig Aufwand an die eigenen Bedürfnisse angepaßt werden kann.
|