Letzter Schritt beim Drag&Drop ist, natürlich!, das Loslassen. Unser Programm muss daher die Nachricht "WM_LBUTTONUP" (linke Maustaste) und/oder "WM_RBUTTONUP" (rechte Maustaste) bearbeiten. Wenn in beiden Fällen das selbe passieren soll, können Sie die Bearbeitung natürlich entsprechend zusammenfassen. Wir gehen erst einmal vom Normalfall aus; sprich: wir haben die linke Maustaste benutzt.
Zuerst geben wir das Tree-View-Fenster wieder frei, damit es aktualisiert werden kann. Dazu dient die Funktion "ImageList_DragLeave", die gleichzeitig auch das Drag-Bild verschwinden lässt.
ImageList_DragLeave(hTreeview);
Als Zeichen, dass die Drag-Operation beendet ist, rufen wir dann "ImageList_DragEnd" auf:
ImageList_EndDrag;
Und da wir die Imagelist nicht mehr benötigen, "zerstören" wir sie
ImageList_Destroy(hDragImgList);
Danach sorgen wir dafür, dass die Mausnachrichten wieder wie gewohnt bearbeitet werden können. Da wir das Item ja losgelassen haben, ist es auch nicht mehr erforderlich, die Mausnachrichten auf unser Fenster zu begrenzen. Die bool-Variable, die uns zur Kontrolle diente, wird bei der Gelegenheit auch wieder zurückgesetzt:
ReleaseCapture; DragMode := false;
Zu guter Letzt markieren wir das Item, das sich zuletzt unter der Position des Mauszeigers befand. Dazu benutzen wir zwei Funktionen: "TreeView_SelectItem" und "TreeView_GetDropHilite". Zur letzteren ist zu sagen, dass sie in Microsofts PSDK eigentlich den Namen "TreeView_GetDropHilight" trägt.
Borland hat ihr aber (zumindest in Delphi 5) einen etwas anderen Namen gegeben. Ob andere Delphi-Versionen den korrekten Namen benutzen, kann ich leider nicht sagen. Im Zweifelsfall sollten Sie es darauf ankommen lassen. Der Compiler wird sich schon melden; so oder so ...
Was tun die beiden Funktionen nun? "TreeView_SelectItem" markiert einen Eintrag im Control und erwartet dessen Handle. Dieses Handle erhalten wir u.a. mit "TreeView_GetDropHilite", wobei uns diese Funktion den Eintrag liefert, der sich zuletzt unter dem Mauszeiger befand. Und das wollten wir ja auch:
TreeView_SelectItem(hTreeview,TreeView_GetDropHilite(hTree-View));
Wenn Sie lieber mit den Nachrichten des Controls arbeiten, dann können Sie auch "TVM_SELECTITEM" und "TVM_GETNEXTITEM" (in Verbindung mit dem TVGN_DROPHILITE-Flag) verwenden:
SendMessage(hTreeview,TVM_SELECTITEM,TVGN_CARET,
SendMessage(hTreeview,TVM_GETNEXTITEM,TVGN_DROPHILITE,0));