Das mit dem Headerclick ist im Prinzip simpel, aber auch knifflig,
denn man muß einen Click zum Sortieren von einem Click zum Verschieben der Spalten
oder Drag Drop von Spalten unterscheiden.
Zuerst der Headerclick ohne Callback
Code: Alles auswählen
Procedure.i MainListeHeaderClick()
With pv.myProgrammvariablen
Protected spalte = -1
Protected p.POINT
Protected HitInfo.HD_HITTESTINFO
Protected flags, iitem
If GetCapture_() = \headerid
GetCursorPos_(p)
MapWindowPoints_(0,\headerid,p,1) ;hwndfrom muß null sein !
Hitinfo\pt\x = p\x
HitInfo\pt\y = p\y
SendMessage_(\headerid,#HDM_HITTEST,0,HitInfo)
flags = hitinfo\flags ;:Debug "flags " + Str(flags)
iitem = hitinfo\iitem ;:Debug "iitem " + Str(iitem)
If flags = #HHT_ONHEADER
spalte = iitem
ElseIf flags = #HHT_ONDIVOPEN And iitem = 0
\headernull = 1 ;es wird versucht
EndIf ;die Breite von Spalte 0 zu ändern
EndIf
EndWith
ProcedureReturn spalte
EndProcedure
Und nun die Events abfangen
Code: Alles auswählen
Procedure.i WM_events(event)
Protected point.Point, j
Static spalte
Select event
;für Mainliste per Headerclick sortieren
Case #WM_LBUTTONDOWN ;linke Maustaste gedrückt
;Rückgabe ist -1 oder Spaltennr. ab 1. Spalte null wird nicht benutzt.
spalte = MainListeHeaderClick()
Case #WM_MOUSEMOVE ;wenn zwischen #WM_LBUTTONDOWN + #WM_LBUTTONUP ein move,
spalte = -1 ;dann Aktion = Drag/Drop oder Breite ändern
Case #WM_LBUTTONUP ;nur wenn zwischen down + up kein move, dann sortieren
If spalte > -1
MainListeHeaderSort(spalte)
ElseIf pv\headernull ;wird in MainListeHeaderClick() ev. gesetzt
pv\headernull = 0
SetGadgetItemAttribute(#main_liste, 0, #PB_ListIcon_ColumnWidth, 0, 0)
EndIf
EndSelect
EndProcedure
in der Main Repeat Schleife sieht es etwa so aus um WM_events(event) einzubinden
Code: Alles auswählen
Repeat: event = WaitWindowEvent() ;: Debug event
WM_events(event)
Select event
Case #PB_Event_Gadget, #PB_Event_Menu
wB = EventGadget()
Datei_Events(wB)
Daten_Events(wB)
If wB = #menu_progende: event = #PB_Event_CloseWindow: EndIf
EndSelect
Until event = #PB_Event_CloseWindow
PS: mit Callback ist es einen Tick einfacher, aber der Weg ist der Gleiche
Das Problem ist ein #WM_MOUSEMOVE zwischen #WM_LBUTTONDOWN + #WM_LBUTTONUP
bei Drag und Drop, falls Drag Drop denn erlaubt wurde