Code: Select all
#CDDS_ITEMPREPAINT = #CDDS_ITEM|#CDDS_PREPAINT
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM|#CDDS_ITEMPREPAINT
Global header_1,header_2,oldCallback,Row_H ,Header_H,dY
Global w.RECT,rc.RECT,lv.RECT
Procedure LIcallback(hwnd, msg, wparam, lparam)
If IsGadget(3)
ShowScrollBar_(GadgetID(2),#SB_BOTH,0)
ShowScrollBar_(GadgetID(3),#SB_BOTH,0)
EndIf
result = CallWindowProc_(oldCallback, hwnd, msg, wparam, lparam)
;
Select msg
Case #WM_VSCROLL,#WM_MOUSEWHEEL
SelItem = GetScrollPos_(GadgetID(1),#SB_VERT) - GetScrollPos_(GadgetID(2),#SB_VERT)
SendMessage_(GadgetID(2), #LVM_SCROLL, 0, SelItem * Row_H)
SendMessage_(GadgetID(3), #LVM_SCROLL, 0, SelItem * Row_H)
RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
Case #WM_HSCROLL
rc.RECT\top = 1
rc.RECT\left = #LVIR_BOUNDS
SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
MoveWindow_(GadgetID(2),rc\left+1,Header_H,Row_H,lv\bottom-dY,1)
MoveWindow_(GadgetID(3),rc\right+1,Header_H,Row_H,lv\bottom-dY,1)
RedrawWindow_(WindowID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
Case #WM_KEYDOWN,#WM_MENUSELECT
; SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0)
; If wParam=#VK_NEXT
; SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_PAGEDOWN,0)
; ElseIf wParam=#VK_PRIOR
; SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_PAGEUP,0)
; ElseIf wParam=#VK_UP
; SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEUP,0)
; ElseIf wParam=#VK_DOWN
; SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEDOWN,0)
; ElseIf wParam=#VK_HOME
; SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_TOP,0)
; ElseIf wParam=#VK_END
; SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_BOTTOM,0)
; ElseIf wParam=#VK_LEFT
; SendMessage_(GadgetID(1),#WM_HSCROLL,#SB_LINELEFT,0)
; ElseIf wParam=#VK_RIGHT
; SendMessage_(GadgetID(1),#WM_HSCROLL,#SB_LINERIGHT,0)
; EndIf
EndSelect
ProcedureReturn result
EndProcedure
;
Procedure WndProc(hwnd, uMsg, wParam, lParam)
GetClientRect_(WindowID(0),w.RECT)
result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_NOTIFY
*NMHDR.NMHDR = lParam
Select *NMHDR\code
Case #NM_CUSTOMDRAW
*LVCDHeader.NMLVCUSTOMDRAW = lParam
Select *LVCDHeader\nmcd\dwDrawStage
Case #CDDS_PREPAINT
;result = #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
result = #CDRF_NOTIFYSUBITEMDRAW
Case #CDDS_SUBITEMPREPAINT
Row = *LVCDHeader\nmcd\dwItemSpec
Col = *LVCDHeader\iSubItem
If (Row/2) * 2 = Row
*LVCDHeader\clrTextBk = $D6FFFF
If Col = 2
*LVCDHeader\clrText = $FF0000
EndIf
Else
*LVCDHeader\clrTextBk = $CEF6F5
If Col = 2
*LVCDHeader\clrText = $FF0000
EndIf
EndIf
result = #CDRF_NEWFONT
EndSelect
EndSelect
*nmHEADER.HD_NOTIFY = lParam
Select *nmHEADER\hdr\code
Case #HDN_ITEMCHANGING,#HDN_ITEMCHANGED
If *nmHEADER\hdr\hwndFrom = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
rc.RECT\top = 1
rc.RECT\left = #LVIR_BOUNDS
SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
MoveWindow_(GadgetID(2),rc\left+1,Header_H,Row_H,lv\bottom-dY,1)
MoveWindow_(GadgetID(3),rc\right+1,Header_H,Row_H,lv\bottom-dY,1)
RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
EndIf
EndSelect
Case #WM_SIZE,#WM_MOVE,#WM_PAINT
MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
rc.RECT\top = 1
rc.RECT\left = #LVIR_BOUNDS
SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
GetClientRect_(GadgetID(1),lv.RECT)
MoveWindow_(GadgetID(2),rc\left+1,Header_H,Row_H,lv\bottom-dY,1)
MoveWindow_(GadgetID(3),rc\right+1,Header_H,Row_H,lv\bottom-dY,1)
RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
EndSelect
ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 640, 300, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget|#PB_Window_SizeGadget |#PB_Window_ScreenCentered)
ListIconGadget(1,10, 10,620, 266, "Column 0",150,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)
Header = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
AddGadgetColumn(1, 1, "Column 1",150)
AddGadgetColumn(1, 2, "Column 2",150)
For i = 3 To 6
AddGadgetColumn(1, i, "Column " + Str(i), 65)
Next
For i = 0 To 30
AddGadgetItem(1, i, "Item "+Str(i)+Chr(10)+Space(6)+"Item "+Str(i)+Chr(10)+Space(6)+"Item "+Str(i)+Chr(10)+"Item "+Str(i)+Chr(10)+"Item 7")
Next
SetGadgetColor(1,#PB_Gadget_BackColor,$EAFEFE)
SetGadgetColor(1,#PB_Gadget_LineColor,$C5C5C5)
Row_H = SendMessage_(GadgetID(1), #LVM_GETITEMSPACING, #True, 0) >> 16 + 2
GetWindowRect_(Header,r.RECT)
Header_H = r\bottom-r\top
If OSVersion() > #PB_OS_Windows_Server_2003
dY = 7
Else
dY = 2
EndIf
ListIconGadget(2,151, Header_H, Row_H, 266, "Column 1",Row_H,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER) ;Height - 20 for the hidden Hal ScrollBar
SetParent_(GadgetID(2),GadgetID(1))
SetWindowLongPtr_(GadgetID(2),#GWL_EXSTYLE,0)
SetGadgetColor(2,#PB_Gadget_BackColor,$EAFEFE)
SetGadgetColor(2,#PB_Gadget_LineColor,$C5C5C5)
For i = 0 To 30
AddGadgetItem(2, i, ""+Chr(10)+"")
Next
ListIconGadget(3,301, Header_H, Row_H, 266, "Column 2",Row_H,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER) ;Height - 20 for the hidden Hal ScrollBar
SetParent_(GadgetID(3),GadgetID(1))
SetWindowLongPtr_(GadgetID(3),#GWL_EXSTYLE,0)
SetGadgetColor(3,#PB_Gadget_BackColor,$EAFEFE)
SetGadgetColor(3,#PB_Gadget_LineColor,$C5C5C5)
For i = 0 To 30
AddGadgetItem(3, i, ""+Chr(10)+"")
Next
oldCallback = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @LIcallback())
oldCallback = SetWindowLongPtr_(GadgetID(2), #GWL_WNDPROC, @LIcallback())
oldCallback = SetWindowLongPtr_(GadgetID(3), #GWL_WNDPROC, @LIcallback())
SetWindowCallback(@WndProc())
SetActiveGadget(1)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Q = 1
Case #WM_CLOSE
Case #PB_Event_Gadget
Select EventGadget()
Case 1
EndSelect
EndSelect
Until Q = 1
EndIf