Ich hab den Code aus dem CodeArchiv für DropDown genommen.
Code: Alles auswählen
; German forum:
; Author: Freak (Timo Harter)
; Date: 17. December 2002
; --------------------------------------------------------------------------
; Drag'n' Drop mit TreeGadgets
; by Timo Harter
;
; Syntax:
; EnableDragDrop( #Gadget, DragMode, @DropProcedure() )
;
; #Gadget : Die Gadgetnummer vom TreeGadget
;
; DragMode : #Drag_LeftMouse = Drag'n'Drop mit linker Maustaste
; #Drag_RightMouse = Drag'n'Drop mit rechter Maustaste
; (kann man mit '|' kombinieren)
;
; @DropProcedure()
; Adresse einer Procedure, die aufgerufen wird, wenn ein Item losgelassen wurde.
; Sie muss folgenden Syntax haben:
;
; Procedure DropProcedure(X.l, Y.l, Button.l, Item.l)
;
; EndProcedure
;
; X, Y enthält die Position, wo es losgelassen wurde
;
; Button enthält #Drag_LeftMouse, wenn die linke Taste benutzt wurde, oder
; #Drag_RightMouse, wenn es die rechte war.
;
; Item enthält die Nummer des Items im TreeGadget, das losgelassen wurde
; (gleicher Index wie bei GetGadgetState() )
;
;
; Anmerkung:
; Wenn das TreeView keine Icons enthält, so werden leere Icons hnzugefügt, weil das Ganze
; ohne nicht funktioniert.
;
; Für mehr Infos bitte das Beispiel ansehen.
;
; -------------------------------------------------------------------------
#TVN_BEGINDRAG = -407
#TVN_BEGINRDRAG = -408
#TVS_DISABLEDRAGDROP = $10
#Drag_LeftMouse = 1
#Drag_RightMouse = 2
; Structure NMTREEVIEW ; Structure is already declared in PB 3.70+
; hdr.NMHDR
; action.l
; itemOld.TV_ITEM
; itemNew.TV_ITEM
; ptDrag.POINT
; EndStructure
Global hWndTV.l, DropProc.l, DragDropMode.l, hDragIml.l, DragItem.l
Procedure.l DragDropCallback(Window.l, Message.l, wParam.l, lParam.l)
Protected DoDrag.l, DropX.l, DropY.l, hItem.l, hItem2.l, dItem.l
result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_NOTIFY
*lp.NMHDR = lParam
If *lp\code = #TVN_BEGINDRAG And (DragDropMode & #Drag_LeftMouse): DoDrag = #True: EndIf
If *lp\code = #TVN_BEGINRDRAG And (DragDropMode & #Drag_RightMouse): DoDrag = #True: EndIf
If DoDrag
*pnmtv.NMTREEVIEW = lParam
DragItem = *pnmtv\itemNew\hItem
hDragIml = SendMessage_(hWndTV, #TVM_CREATEDRAGIMAGE, 0, DragItem)
SendMessage_(hWndTV, #TVM_SELECTITEM, #TVGN_CARET, #Null)
ImageList_BeginDrag_(hDragIml, 0, 0, 0)
ImageList_DragEnter_(GetParent_(hWndTV), 0, 0)
ImageList_DragShowNolock_(#True)
ImageList_DragLeave_(hWndTV)
ShowCursor_(#False)
SetCapture_(GetParent_(hWndTV))
SendMessage_(hWndTV, #TVM_SELECTITEM, #TVGN_CARET, DragItem)
CallFunctionFast(DropProc, WindowMouseX(0), WindowMouseY(0), -1, -1)
EndIf
Case #WM_MOUSEMOVE
If hDragIml
DropX = PeekW(@lParam)
DropY = PeekW(@lParam+2)
ImageList_DragMove_(DropX, DropY+20)
ImageList_DragShowNolock_(#False)
ImageList_DragShowNolock_(#True)
EndIf
Case #WM_LBUTTONUP
If hDragIml And (DragDropMode & #Drag_LeftMouse)
ImageList_EndDrag_()
ReleaseCapture_()
ShowCursor_(#True)
ImageList_Destroy_(hDragIml)
hDragIml = #False
dItem = 0
hItem = SendMessage_(hWndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
While hItem <> DragItem
hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
Repeat
If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
Until hItem2 <> #Null
hItem = hItem2
dItem + 1
Wend
CallFunctionFast(DropProc, WindowMouseX(0), WindowMouseY(0), #Drag_LeftMouse, dItem)
EndIf
Case #WM_RBUTTONUP
If hDragIml And (DragDropMode & #Drag_RightMouse)
ImageList_EndDrag_()
ReleaseCapture_()
ShowCursor_(#True)
ImageList_Destroy_(hDragIml)
hDragIml = #False
dItem = 0
hItem = SendMessage_(hWndTV, #TVM_GETNEXTITEM, #TVGN_ROOT, 0)
While hItem <> DragItem
hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_CHILD, hItem)
Repeat
If hItem2 = #Null: hItem2 = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_NEXT, hItem): EndIf
If hItem2 = #Null: hItem = SendMessage_(hwndTV, #TVM_GETNEXTITEM, #TVGN_PARENT, hItem): EndIf
Until hItem2 <> #Null
hItem = hItem2
dItem + 1
Wend
CallFunctionFast(DropProc, WindowMouseX(0), WindowMouseY(0), #Drag_RightMouse, DragItem)
EndIf
EndSelect
ProcedureReturn result
EndProcedure
Procedure.l EnableDragDrop(TVGadget.l, DragMode.l, DropProcedure.l)
Protected Style.l, hIml.l
hWndTV = GadgetID(TVGadget)
DropProc = DropProcedure
DragDropMode = DragMode
Style = GetWindowLong_(hWndTV, #GWL_STYLE)
Style = Style & (~#TVS_DISABLEDRAGDROP)
SetWindowLong_(hWndTV, #GWL_STYLE, Style)
If SendMessage_(hWndTV, #TVM_GETIMAGELIST, #TVSIL_NORMAL, 0) = #Null
hIml = ImageList_Create_(16,16,#ILC_COLOR8,0,999)
SendMessage_(hWndTV, #TVM_SETIMAGELIST, #TVSIL_NORMAL, hIml)
EndIf
SetWindowCallback(@DragDropCallback())
ProcedureReturn #True
EndProcedure
; -------------------------------------------------------------------------
; Beispiel Code:
; -------------------------------------------------------------------------
#Tree = 1
Global mypoint.Point
; diese Procedure wird aufgerufen nach dem Drag'n'drop Vorgang:
Procedure DropProcedure(X.l, Y.l, Button.l, Item.l)
If Button = - 1
mypoint\x = X
mypoint\y = Y
ElseIf Button = #Drag_LeftMouse
mypoint\x=mypoint\y-X
mypoint\y=mypoint\y-Y
If X > GadgetX(#Tree) And X < GadgetX(#Tree)+GadgetWidth(#Tree) And Y > GadgetY(#Tree) And Y < GadgetY(#Tree)+GadgetHeight(#Tree)
MessageRequester("Drag'n Drop","Item Number "+Str(Item)+" has been dropped at X:"+Str(X)+" Y:"+Str(Y)+" using left Button."+#LF$+"Changed: X:"+Str(mypoint\x-mypoint\x*2)+" Y:"+Str(mypoint\y-mypoint\y*2),#MB_ICONINFORMATION)
EndIf
EndIf
EndProcedure
; Window und Gadget...
OpenWindow(0, 0, 0, 640, 480, "Drag'n Drop", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
TreeGadget(#Tree, 5, 5, 150, 250)
hImg = LoadIcon_(0,#IDI_APPLICATION)
AddGadgetItem(#Tree, 0, "Item1", hImg)
AddGadgetItem(#Tree, 0, "Item2")
AddGadgetItem(#Tree, 0, "Item3", 0, 1)
AddGadgetItem(#Tree, 0, "Item4", 0, 1)
; mehr als das muß man nicht tun:
EnableDragDrop(#Tree, #Drag_LeftMouse, @DropProcedure())
; warten auf Ende...
While WaitWindowEvent() <> #PB_Event_CloseWindow: Wend
End
; -------------------------------------------------------------------------
Wie bekomm ich da jetzt heraus, über welches Item ich gegangen bin, da mit ich weis, um wie viel stellen sich das Item verschiebt.