Structure SWAPPANELINFO drag.l oldcb.l EndStructure Structure TCHITTESTINFO Extends LVHITTESTINFO EndStructure Macro SWAP_LOWORD(value) : (value & $FFFF) : EndMacro Macro SWAP_HIWORD(value) : (value >> 16 & $FFFF) : EndMacro Procedure _SwapPanelItem(hWnd,i1,i2) Protected tcm.TC_ITEM Protected buf1.l Protected result If i1 = i2 Or i1 = -1 Or i2 = -1 ProcedureReturn 0 EndIf buf1.l = AllocateMemory(64) tcm\mask = #TCIF_IMAGE | #TCIF_PARAM | #TCIF_TEXT tcm\pszText = buf1 tcm\cchTextMax = 64 If SendMessage_(hwnd,#TCM_GETITEM,i1,tcm) SendMessage_(hwnd,#TCM_DELETEITEM,i1,0) SendMessage_(hwnd,#TCM_INSERTITEM,i2,tcm) SendMessage_(hwnd,#TCM_SETCURSEL,i2,0) EndIf FreeMemory(buf1) ProcedureReturn 0 EndProcedure Procedure _GetItemFromParam(hWnd,lParam) Protected tchi.TCHITTESTINFO tchi\pt\x = SWAP_LOWORD(lParam) tchi\pt\y = SWAP_HIWORD(lParam) tchi\flags = #TCHT_ONITEMLABEL ProcedureReturn SendMessage_(hWnd,#TCM_HITTEST,0,tchi) EndProcedure Procedure _SwapPanelProc(hWnd,Msg,wParam,lParam) Protected *spd.SWAPPANELINFO Protected item.l *spd = GetWindowLong_(hWnd,#GWL_USERDATA) If Msg = #WM_LBUTTONDOWN *spd\drag = _GetItemFromParam(hWnd,lParam) EndIf If Msg = #WM_LBUTTONUP *spd\drag = -1 EndIf If Msg = #WM_MOUSEMOVE If wParam = #MK_LBUTTON SetCursor_(LoadCursor_(0,#IDC_UPARROW)) item = _GetItemFromParam(hWnd,lParam) If item > -1 _SwapPanelItem(hWnd,*spd\drag,item) *spd\drag = item EndIf EndIf EndIf If Msg = #WM_NCDESTROY CallWindowProc_(*spd\oldcb,hWnd,Msg,wParam,lParam) SetWindowLong_(hwnd,#GWL_WNDPROC,*spd\oldcb) FreeMemory(*spd) ProcedureReturn 0 EndIf ProcedureReturn CallWindowProc_(*spd\oldcb,hWnd,Msg,wParam,lParam) EndProcedure Procedure InstallSwapPanel(gadget) Protected *spd.SWAPPANELINFO *spd = AllocateMemory(SizeOf(SWAPPANELINFO)) *spd\drag = -1 *spd\oldcb = SetWindowLong_(gadget,#GWL_WNDPROC,@_SwapPanelProc()) SetWindowLong_(gadget,#GWL_USERDATA,*spd) EndProcedure Procedure PB_PanelGadget(id.l ,x.l ,y.l ,cx.l ,cy.l) Protected value = PanelGadget(id,x,y,cx,cy) If id = #PB_Any id = value EndIf InstallSwapPanel(GadgetID(id) ) ProcedureReturn value EndProcedure Macro PanelGadget PB_PanelGadget EndMacro Procedure Main() Protected hwnd Protected panel Protected event hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,480,320,"") If hwnd panel = PanelGadget(0,5,5,470,310) Else ProcedureReturn 0 EndIf If panel AddGadgetItem(0,-1,"1") ButtonGadget(-1,5,5,75,23,"1") AddGadgetItem(0,-1,"2") ButtonGadget(-1,5,5,75,23,"2") EndIf Repeat event = WaitWindowEvent() Until event = #PB_Event_CloseWindow EndProcedure:Main()
|