Notice that "nmcd\uItemState=(CDIS_FOCUS|CDIS_SELECTED)" is used to see if the item is currently focused/selected - maybe you could use this also with listview and other gadgets?
It seems to work quite well with a TreeView but it does not seem to work with a ListIconView :
Code: Select all
Enumeration
#MainWindow
#TreeGadget
EndEnumeration
#CDIS_FOCUS = $10
#CDIS_SELECTED = 1
#CDDS_ITEM = $10000
#CDDS_MAPPART = 5
#CDDS_POSTERASE = 4
#CDDS_POSTPAINT = 2
#CDDS_PREERASE = 3
#CDDS_PREPAINT = 1
#CDDS_ITEMPOSTERASE = #CDDS_ITEM | #CDDS_POSTERASE
#CDDS_ITEMPOSTPAINT = #CDDS_ITEM | #CDDS_POSTPAINT
#CDDS_ITEMPREERASE = #CDDS_ITEM | #CDDS_PREERASE
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDDS_SUBITEM = $20000
#CDRF_DODEFAULT = 0
#CDRF_NEWFONT = 2
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_NOTIFYPOSTERASE = $40
#CDRF_NOTIFYPOSTPAINT = $10
#CDRF_NOTIFYSUBITEMDRAW = $20
#CDRF_SKIPDEFAULT = 4
Procedure MyWindowCallback(WindowID,Message,wParam,lParam)
Result=#PB_ProcessPureBasicEvents
Select Message
Case #WM_NOTIFY
*lvCD.NMLVCUSTOMDRAW = lParam
If *lvCD\nmcd\hdr\hwndFrom=GadgetID(#TreeGadget) And *lvCD\nmcd\hdr\code=#NM_CUSTOMDRAW
Select *lvCD\nmcd\dwDrawStage
Case #CDDS_PREPAINT
ProcedureReturn #CDRF_NOTIFYPOSTPAINT|#CDRF_NOTIFYITEMDRAW
Case #CDDS_PREPAINT
ProcedureReturn #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT
If *lvCD\nmcd\uItemState & (#CDIS_FOCUS | #CDIS_SELECTED)
Debug "Selected line " + Str(*lvCD\nmcd\dwItemSpec)
*lvCD\clrText=RGB(0,255,0)
*lvCD\clrTextBk=RGB(0,0,255)
; the selected line is not colorized
Else
*lvCD\clrText=RGB(255,255,0)
*lvCD\clrTextBk=RGB(0,0,255)
EndIf
ProcedureReturn #CDRF_NEWFONT
EndSelect
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
If OpenWindow(#MainWindow,0,0,355,180,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ListIconGadget") And CreateGadgetList(WindowID(0))
ListIconGadget(#TreeGadget, 10,10,330,160, "0", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(1, 1, "1", 100)
AddGadgetColumn(1, 2, "2", 100)
AddGadgetItem(1, -1, "0:0" + Chr(10) + "0:1" + Chr(10) + "0:2")
AddGadgetItem(1, -1, "1:0" + Chr(10) + "1:1" + Chr(10) + "1:2")
AddGadgetItem(1, -1, "2:0" + Chr(10) + "2:1" + Chr(10) + "2:2")
AddGadgetItem(1, -1, "3:0" + Chr(10) + "3:1" + Chr(10) + "3:2")
AddGadgetItem(1, -1, "4:0" + Chr(10) + "4:1" + Chr(10) + "4:2")
AddGadgetItem(1, -1, "5:0" + Chr(10) + "5:1" + Chr(10) + "5:2")
AddGadgetItem(1, -1, "6:0" + Chr(10) + "6:1" + Chr(10) + "6:2")
AddGadgetItem(1, -1, "7:0" + Chr(10) + "7:1" + Chr(10) + "7:2")
SetWindowCallback(@MyWindowCallback())
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
This is a bit tricky but seems to work with a ListIconView :
Code: Select all
Enumeration
#MainWindow
#TreeGadget
EndEnumeration
#CDIS_FOCUS = $10
#CDIS_SELECTED = 1
#CDDS_ITEM = $10000
#CDDS_MAPPART = 5
#CDDS_POSTERASE = 4
#CDDS_POSTPAINT = 2
#CDDS_PREERASE = 3
#CDDS_PREPAINT = 1
#CDDS_SUBITEM = $20000
#CDDS_ITEMPOSTERASE = #CDDS_ITEM | #CDDS_POSTERASE
#CDDS_ITEMPOSTPAINT = #CDDS_ITEM | #CDDS_POSTPAINT
#CDDS_ITEMPREERASE = #CDDS_ITEM | #CDDS_PREERASE
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM | #CDDS_ITEMPREPAINT
#CDDS_SUBITEM = $20000
#CDRF_DODEFAULT = 0
#CDRF_NEWFONT = 2
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_NOTIFYPOSTERASE = $40
#CDRF_NOTIFYPOSTPAINT = $10
#CDRF_NOTIFYSUBITEMDRAW = $20
#CDRF_SKIPDEFAULT = 4
Procedure.l MyWindowCallback(WindowID,Message,wParam,lParam)
Result=#PB_ProcessPureBasicEvents
Select Message
Case #WM_NOTIFY
*lvCD.NMLVCUSTOMDRAW = lParam
If *lvCD\nmcd\hdr\hwndFrom=GadgetID(#TreeGadget) 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_SUBITEMPREPAINT
If *lvCD\nmcd\uItemState & #CDIS_SELECTED
Debug "Selected line " + Str(*lvCD\nmcd\dwItemSpec) + " column " + Str(*lvCD\iSubItem)
*lvCD\nmcd\uItemState = *lvCD\nmcd\uItemState &~#CDIS_SELECTED
Result = #CDRF_DODEFAULT
EndIf
If *lvCD\nmcd\uItemState & #CDIS_FOCUS
*lvCD\clrText=RGB(0,255,255)
*lvCD\clrTextBk=RGB(255,127,255)
Result = #CDRF_NEWFONT
Else
*lvCD\clrText=RGB(255,255,0)
*lvCD\clrTextBk=RGB(0,0,255)
Result = #CDRF_NEWFONT
EndIf
EndSelect
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
If OpenWindow(#MainWindow,0,0,355,180,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ListIconGadget") And CreateGadgetList(WindowID(0))
ListIconGadget(#TreeGadget, 10,10,330,160, "0", 100, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
AddGadgetColumn(1, 1, "1", 100)
AddGadgetColumn(1, 2, "2", 100)
AddGadgetItem(1, -1, "0:0" + Chr(10) + "0:1" + Chr(10) + "0:2")
AddGadgetItem(1, -1, "1:0" + Chr(10) + "1:1" + Chr(10) + "1:2")
AddGadgetItem(1, -1, "2:0" + Chr(10) + "2:1" + Chr(10) + "2:2")
AddGadgetItem(1, -1, "3:0" + Chr(10) + "3:1" + Chr(10) + "3:2")
AddGadgetItem(1, -1, "4:0" + Chr(10) + "4:1" + Chr(10) + "4:2")
AddGadgetItem(1, -1, "5:0" + Chr(10) + "5:1" + Chr(10) + "5:2")
AddGadgetItem(1, -1, "6:0" + Chr(10) + "6:1" + Chr(10) + "6:2")
AddGadgetItem(1, -1, "7:0" + Chr(10) + "7:1" + Chr(10) + "7:2")
SetWindowCallback(@MyWindowCallback())
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf