Für alle, die ihren Listboxen das Sortieren per Hand ermöglichen wollen (Drag&Drop innerhalb der Listbox), hier der passende Code.
[Blockierte Grafik: http://s2.postimage.org/mBrwr.jpg]
Code
$H Windows.ph
$H Messages.ph
DEF $DRAGLISTMSGSTRING "commctrl_DragListMsg"
DEF &DL_BEGINDRAG 1157
DEF &DL_DRAGGING 1158
DEF &DL_DROPPED 1159
DEF &DL_MOVECURSOR 3
DEF &DL_COPYCURSOR 2
Struct POINT = X&,Y&
Struct DRAGLISTINFO = uNotification&,hWnd&,ptCursor!POINT
Var FirstItem& = 0
Var LastItem& = 0
Var MoveString$ = ""
Var MoveCursor& = ~LoadCursor(~GetModuleHandle("shell32.dll"),1003)
'Genau diese spezielle Meldung muss registiert werden
'damit das Fenster die Drag&Drop Operationen verarbeiten kann.
Var DragMSG& = ~RegisterWindowMessage($DRAGLISTMSGSTRING)
CLS
SetDialogFont ~GetStockObject(~ANSI_VAR_FONT)
Var Ende& = 0
Var Draglist& = Create("Listbox",%hwnd,0,10,10,300,300)
'Die Listbox für Drag&Drop vobereiten
External("comctl32.dll","MakeDragList",Draglist&)
Addstring(Draglist&,"Eintrag")
Addstring(Draglist&,"Auftrag")
Addstring(Draglist&,"Anton")
Addstring(Draglist&,"Otto")
Addstring(Draglist&,"Werner")
Addstring(Draglist&,"Karl")
SubClass %HWnd,1
WhileNot Ende&
Waitinput
EndWhile
SubClassProc
If SubClassMessage(%hWnd,DragMSG&)
Var Info# = New(DRAGLISTINFO)
Info# = &slParam
If Info#.uNotification& = &DL_BEGINDRAG
'Drag&Drop beginnt
'Item merken
FirstItem& = External("comctl32.dll","LBItemFromPt",Draglist&,Info#.ptCursor!X&,Info#.ptCursor!Y&,1)
'Marker zeichnen, muss nicht sein, erhöht aber die Sichtbarkeit
External("comctl32.dll","DrawInsert",%hwnd,Draglist&,Firstitem&)
'Item-Text merken
MoveString$ = GetString$(Draglist&,FirstItem&)
Set("WinProc", 0)
'Cursor benutzen
~SetCursor(MoveCursor&)
Return &DL_COPYCURSOR
ElseIf Info#.uNotification& = &DL_DRAGGING
'Drag&Drop ist im Gange
'Item merken
LastItem& = External("comctl32.dll","LBItemFromPt",Draglist&,Info#.ptCursor!X&,Info#.ptCursor!Y&,1)
'Marker neuzeichnen
External("comctl32.dll","DrawInsert",%hwnd,Draglist&,LastItem&)
Set("WinProc", 0)
'Item markieren, muss nich sein, erhöht aber die Sichtbarkeit
SendMessage(DragList&,~LB_SETCURSEL,LastItem&,0)
'Cursor benutzen
~SetCursor(MoveCursor&)
ElseIf Info#.uNotification& = &DL_DROPPED
'Drag&Drop ist beendet
'Item merken
LastItem& = External("comctl32.dll","LBItemFromPt",Draglist&,Info#.ptCursor!X&,Info#.ptCursor!Y&,1)
If Lastitem& <> -1
'Marker entfernen
External("comctl32.dll","DrawInsert",%hwnd,Draglist&,-1)
'das erste gemerkte Item löschen
DeleteString(DragList&,FirstItem&)
'und an der Position des letzten gemerkten Items einfügen
InsertString(DragList&,LastItem&,MoveString$)
'Item demarkieren
SendMessage(DragList&,~LB_SETCURSEL,-1,0)
Set("WinProc", 0)
EndIf
EndIf
EndIf
EndProc
Alles anzeigen