Here is the promised example.
Code: Select all
EnableExplicit
;Global listicon_colorline_undermouse=#PB_Default;For no underlining
Global listicon_colorline_undermouse=#Green;For a green underline
Structure str_listicon
oldproc.i
gadget.i
EndStructure
Define listicon.str_listicon
Macro HIWORD(val)
val>>16
EndMacro
Macro LOWORD(val)
val&$FFFF
EndMacro
Procedure listicon_onclick(gadget,*ht.LVHITTESTINFO)
If *ht\flags & #LVHT_ONITEM
If Not (*ht\flags & #LVHT_ONITEMLABEL)
SetGadgetItemState(gadget,*ht\iItem,GetGadgetItemState(gadget,*ht\iItem) ! #PB_ListIcon_Checked | #PB_ListIcon_Selected)
Else
SetGadgetItemState(gadget,*ht\iItem,GetGadgetItemState(gadget,*ht\iItem) | #PB_ListIcon_Selected)
EndIf
SetGadgetState(gadget,*ht\iItem)
EndIf
EndProcedure
Procedure listicon_resetcolorline(gadget,line,color)
If line>-1
SetGadgetItemColor(gadget,line,#PB_Gadget_BackColor,color)
EndIf
EndProcedure
Procedure ListProc(hWnd, Msg, wParam, lParam)
Protected *nmlv.NM_LISTVIEW
Static state,ht.LVHITTESTINFO
Static oldline=-1
Static oldcolor=-1
Define actuelline,this.POINT,*listicon.str_listicon
*listicon=GetProp_(hWnd, "oldproc")
If *listicon
Select msg
Case #WM_LBUTTONDOWN
listicon_onclick(*listicon\gadget,ht)
ProcedureReturn #PB_Event_None;required for #wm_lbuttonup event
Case #WM_LBUTTONUP
;Debug "Left Button up"
ProcedureReturn #PB_Event_None
Case #WM_RBUTTONDOWN
listicon_onclick(*listicon\gadget,ht)
DisplayPopupMenu(0,WindowID(0))
ProcedureReturn #PB_Event_None;;required for #wm_rbuttonup event
Case #WM_RBUTTONUP
Debug "Right Button Up"
ProcedureReturn #PB_Event_None
Case #WM_KEYDOWN
;Debug "keydown"
Case #WM_KEYUP
If wParam = #VK_RETURN
Debug "Name : "+GetGadgetItemText(*listicon\gadget,GetGadgetState(0),0)
EndIf
ProcedureReturn #PB_Event_None
;Case #WM_MOUSEMOVE
;Debug "WM_MOUSEMOVE"
;listicon_mousemoveover(*myself)
Case #WM_NCHITTEST
;Debug "#WM_NCHITTEST"
With this
\x = LOWORD(lParam)
\y = HIWORD(lParam)
EndWith
MapWindowPoints_(0, hWnd, @this, 1)
With ht
\pt\x=this\x
\pt\y=this\y
EndWith
SendMessage_(hWnd,#LVM_HITTEST,0,@ht)
If listicon_colorline_undermouse>#PB_Default
listicon_resetcolorline(*listicon\gadget,oldline,oldcolor)
oldline=ht\iItem
If ht\flags & #LVHT_ONITEM
oldcolor=GetGadgetItemColor(*listicon\gadget,ht\iItem,#PB_Gadget_BackColor,-1)
SetGadgetItemColor(*listicon\gadget,ht\iItem,#PB_Gadget_BackColor,listicon_colorline_undermouse,-1)
EndIf
EndIf
Case #WM_MOUSELEAVE
If listicon_colorline_undermouse>#PB_Default
listicon_resetcolorline(*listicon\gadget,oldline,oldcolor)
EndIf
EndSelect
ProcedureReturn CallWindowProc_(*listicon\oldproc, hWnd, Msg, wParam, lParam)
Else
ProcedureReturn DefWindowProc_(hWnd, Msg, wParam, lParam)
EndIf
EndProcedure
OpenWindow(0,0,0,320,240,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
If CreatePopupMenu(0)
MenuTitle("Item")
MenuItem(1,"Show Name")
EndIf
ListIconGadget(0, 10,10,230,200,"Name",120,#PB_ListIcon_CheckBoxes|#PB_ListIcon_FullRowSelect)
listicon\oldproc=GetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC)
listicon\gadget=0
SetProp_(GadgetID(0),"oldproc",listicon)
SetWindowLongPtr_(GadgetID(0),#GWL_WNDPROC,@ListProc())
AddGadgetColumn(0, 1, "Age",100)
AddGadgetItem(0, -1, "Norman"+Chr(10)+"18")
AddGadgetItem(0, -1, "Charlene"+Chr(10)+"22")
AddGadgetItem(0, -1, "Donna"+Chr(10)+"20")
AddGadgetItem(0, -1, "Philip"+Chr(10)+"20")
AddGadgetItem(0, -1, "Arthur"+Chr(10)+"19")
AddGadgetItem(0, -1, "Norman"+Chr(10)+"18")
AddGadgetItem(0, -1, "Charlene"+Chr(10)+"22")
AddGadgetItem(0, -1, "Donna"+Chr(10)+"20")
AddGadgetItem(0, -1, "Philip"+Chr(10)+"20")
AddGadgetItem(0, -1, "Arthur"+Chr(10)+"19")
SetActiveGadget(0)
SetGadgetItemColor(0,2,#PB_Gadget_BackColor,#Red,-1)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Menu
Select EventMenu()
Case 1
Debug "Name : "+GetGadgetItemText(0,GetGadgetState(0),0)
SetActiveGadget(0)
EndSelect
EndSelect
ForEver