FVBUSICOULOUR 15
drag and move Tab (PanelGadget)
Samstag, 29. März 2008 um 13:27
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()
Aktualisiert ( Samstag, 18. April 2009 um 15:30 )
 
Kommentare (1)
1 Sonntag, 30. März 2008 um 11:59
RSBasic
Geile Sache
© 2012 www.realsource.de
free Joomla Template by funky-visions.de powered by greatnet.de Webhosting