Very flexible
Code: Select all
Global Dragf,ColorBrush,NormalBrush
Procedure WindowCallback(hwnd, msg, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Select msg
Case #WM_NOTIFY
*lvCD.NMLVCUSTOMDRAW = lParam
If *lvCD\nmcd\hdr\hwndFrom=GadgetID(0) And *lvCD\nmcd\hdr\code = #NM_CUSTOMDRAW
Select *lvCD\nmcd\dwDrawStage
Case #CDDS_PREPAINT
;result = #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
result = #CDRF_NOTIFYSUBITEMDRAW
Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM
thisRow = *lvCD\nmcd\dwItemSpec
thisCol = *lvCD\iSubItem
subItemRect.RECT\left = #LVIR_LABEL
subItemRect.RECT\top = *lvCD\iSubItem
SendMessage_(GadgetID(0), #LVM_GETSUBITEMRECT, thisRow, @subItemRect)
SetTextColor_(*lvCD\nmcd\hdc, $000000)
If GetGadgetState(0) = thisRow
If dragf = 1
FillRect_(*lvCD\nmcd\hdc, subItemRect, ColorBrush)
Else
FillRect_(*lvCD\nmcd\hdc, subItemRect, NormalBrush)
SetTextColor_(*lvCD\nmcd\hdc, $FFFFFF)
EndIf
EndIf
InflateRect_(subItemRect,-2,0)
Text$ = GetGadgetItemText(0,thisRow,thisCol)
DrawText_(*lvCD\nmcd\hdc, Text$, Len(Text$), subItemRect, #DT_VCENTER | #DT_END_ELLIPSIS)
result = #CDRF_SKIPDEFAULT
EndSelect
EndIf
EndSelect
ProcedureReturn result
EndProcedure
Procedure DragDrop(Gad, iFrom, iTo)
For i = 0 To CountGadgetItems(0)-1
Text$ = Text$ + GetGadgetItemText(Gad, iFrom,i)+Chr(10)
Next
RemoveGadgetItem(Gad,iFrom)
AddGadgetItem(Gad,iTo,Text$)
EndProcedure
LoadFont(0,"Tahoma",14)
If OpenWindow(0, 0, 0, 800, 600, "Set Select Color", #PB_Window_SystemMenu|#PB_Window_ScreenCentered | #PB_Window_SizeGadget)
SetWindowCallback(@WindowCallback())
ListIconGadget(0, 10, 10, 780, 580, "Column 0", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines | #PB_ListIcon_AlwaysShowSelection )
AddGadgetColumn(0, 1, "Column 1", 200)
AddGadgetColumn(0, 2, "Column 2", 200)
For a=0 To 1000
addtext$ = "Column 0 item # " + Str(a) + Chr(10) + "Column 1 item # " + Str(a) + Chr(10) + "Column 2 item # " + Str(a)
AddGadgetItem(0,-1, addtext$)
Next
SetGadgetFont(0,FontID(0))
RowHeight = SendMessage_(GadgetID(0), #LVM_GETITEMSPACING, #True, 0) >> 16
CreateImage(0,RowHeight,RowHeight)
StartDrawing(ImageOutput(0))
Box(0,0,RowHeight,RowHeight,$FFFFFF)
Box(0,RowHeight-3,RowHeight,3,$0000FF)
StopDrawing()
ColorBrush = CreatePatternBrush_(ImageID(0))
CreateImage(1,RowHeight,RowHeight)
StartDrawing(ImageOutput(1))
Box(0,0,RowHeight,RowHeight,$FE9146)
StopDrawing()
NormalBrush = CreatePatternBrush_(ImageID(1))
FreeImage(0)
FreeImage(1)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #WM_MOUSEMOVE
If GetAsyncKeyState_(#VK_LBUTTON) & $8000 = $8000
GetCursorPos_(p.POINT)
ScreenToClient_(GadgetID(0),@p)
Dragf = 1
SendMessage_(GadgetID(0), #LVM_SETEXTENDEDLISTVIEWSTYLE,0,SendMessage_(GadgetID(0),#LVM_GETEXTENDEDLISTVIEWSTYLE,0,0)| #LVS_EX_TRACKSELECT)
SendMessage_(GadgetID(0), #LVM_SETHOVERTIME, 0, 1)
Drop = GetGadgetState(0)
If p\y < 2*RowHeight
SendMessage_(GadgetID(0),#WM_VSCROLL,#SB_LINEUP, 0)
ElseIf p\y > (GadgetHeight(0)-2*RowHeight)
SendMessage_(GadgetID(0),#WM_VSCROLL,#SB_LINEDOWN, 0)
EndIf
EndIf
Case #WM_LBUTTONDOWN
Drag = GetGadgetState(0)
Case #WM_LBUTTONUP
If Dragf = 1 And Drag >= 0
Dragf = 0
SendMessage_(GadgetID(0), #LVM_SETEXTENDEDLISTVIEWSTYLE,0,SendMessage_(GadgetID(0),#LVM_GETEXTENDEDLISTVIEWSTYLE,0,0) &~ #LVS_EX_TRACKSELECT)
If Drag > Drop
Drop + 1
EndIf
DragDrop(0, Drag,Drop)
EndIf
EndSelect
Until Quit = 1
EndIf
End
Edit 2: Scroll Up or Down while dragging enabled