Code: Select all
EnableExplicit
Import "Comctl32.lib"
SetWindowSubclass(hWnd, *fnSubclass, uIdSubclass, dwRefData)
GetWindowSubclass(hWnd, *fnSubclass, uIdSubclass, *dwRefData)
RemoveWindowSubclass(hWnd, *fnSubclass, uIdSubclass)
DefSubclassProc(hWnd, uMsg, wParam, lParam)
EndImport
Structure _DATA_
window.i
gadget.i
EndStructure
#Type_Checkbox_Changed = #PB_EventType_FirstCustomValue
Define i
Procedure LVProc(hwnd, msg, wparam, lparam, uIdSubclass, *d._DATA_)
Protected hitinfo.LVHITTESTINFO
Select msg
Case #WM_NCDESTROY
RemoveWindowSubclass(hWnd, @LVProc(), uIdSubclass)
FreeStructure(*d)
Case #WM_LBUTTONDOWN
With hitinfo
\pt\x = lparam & $FFFF
\pt\y = lparam >> 16
EndWith
SendMessage_(hwnd, #LVM_SUBITEMHITTEST, 0, @hitInfo)
PostEvent(#PB_Event_Gadget, *d\window, *d\gadget, #Type_Checkbox_Changed, hitinfo\iItem)
EndSelect
ProcedureReturn DefSubclassProc(hwnd, msg, wparam, lparam)
EndProcedure
Procedure AddSpecialListIconHandling(ParentWindow.i, ListIconGadget.i)
Protected *d._DATA_
*d = AllocateStructure(_DATA_)
*d\window = ParentWindow
*d\gadget = ListIconGadget
SetWindowSubclass(GadgetID(ListIconGadget), @LVProc(), 1, *d)
EndProcedure
OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0, 10, 10, 480, 380, "Column 1", 100, #PB_ListIcon_GridLines | #PB_ListIcon_CheckBoxes)
For i = 0 To 25
AddGadgetItem(0, - 1, RSet(Chr(i + 65), 8, Chr(i + 65)))
Next i
AddSpecialListIconHandling(0, 0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case 0
Select EventType()
Case #Type_Checkbox_Changed
i = EventData()
If GetGadgetItemState(0, i) & #PB_ListIcon_Checked
Debug "Checkbox #" + Str(i) + " => ticked!"
Else
Debug "Checkbox #" + Str(i) + " => unticked!"
EndIf
Case #PB_EventType_Change
Debug "Selected item changed? => " + Str(GetGadgetState(0))
EndSelect
EndSelect
EndSelect
ForEver

