jede 2.Zeile grau im Listicongadget mit NM_CUSTOMDRAW
Verfasst: 22.03.2012 23:22
jede 2. Zeile grau im LV machen die meisten siche mit SetGadgetItemColor().
Mit NM_CUSTOMDRAW geht es ca 10% schneller und das macht bei großen Listen schon was aus.
Mit NM_CUSTOMDRAW geht es ca 10% schneller und das macht bei großen Listen schon was aus.
Code: Alles auswählen
XIncludeFile "\Bremer\PureBasicPbi\DebugMacros.pbi"
EnableExplicit
Enumeration
#win
#bt1
#bt2
#lv1
EndEnumeration
LoadFont(1,"ARIAL", 11)
LoadFont(2,"ARIAL", 10, #PB_Font_Bold)
Procedure WinCallback(hWnd, msg, wParam, lParam)
Protected result = #PB_ProcessPureBasicEvents
Protected j, iitem, isubitem
Protected *nmhdr.NMHDR
Protected *nmlistview.NM_LISTVIEW
Protected *nmlvcustomdraw.NMLVCUSTOMDRAW
Select msg
Case #WM_NOTIFY
*nmhdr = lParam
*nmlistview = lParam
*nmlvcustomdraw = lParam
If *nmhdr\idFrom = #lv1
If *nmhdr\code = #NM_CUSTOMDRAW
Select *nmlvcustomdraw\nmcd\dwDrawStage
Case #CDDS_PREPAINT: result = #CDRF_NOTIFYITEMDRAW
Case #CDDS_ITEMPREPAINT: result = #CDRF_NOTIFYSUBITEMDRAW
Case #CDDS_ITEMPREPAINT | #CDDS_SUBITEM
iitem = *nmlvcustomdraw\nmcd\dwItemSpec ;:Debug iitem
isubitem = *nmlvcustomdraw\iSubItem
;Standard
*nmlvcustomdraw\clrTextBk = #White
;jede 2.Zeile grau
If Mod(iitem,2): *nmlvcustomdraw\clrTextBk = $f0f0f0: EndIf
;bei Bedarf
Select isubitem
Case 0
*nmlvcustomdraw\clrText = #Black
SelectObject_(*nmlvcustomdraw\nmcd\hDC, FontID(2))
Case 1
*nmlvcustomdraw\clrText = #Red
SelectObject_(*nmlvcustomdraw\nmcd\hDC, FontID(1))
Case 3
*nmlvcustomdraw\clrText = #Green
SelectObject_(*nmlvcustomdraw\nmcd\hDC, FontID(2))
If Val(GetGadgetItemText(#lv1, iitem, 3)) < 80
*nmlvcustomdraw\clrText = #Magenta
EndIf
Default
*nmlvcustomdraw\clrText = #Blue
SelectObject_(*nmlvcustomdraw\nmcd\hDC, FontID(1))
EndSelect
result = #CDRF_NEWFONT
EndSelect
ElseIf *nmlistview\hdr\code = #LVN_DELETEITEM
j = SendMessage_(*nmlistview\hdr\hwndFrom, #LVM_GETCOUNTPERPAGE, 0, 0)
SendMessage_(*nmlistview\hdr\hwndFrom, #LVM_REDRAWITEMS, *nmlistview\iItem, *nmlistview\iItem + j)
EndIf
EndIf
EndSelect
ProcedureReturn result
EndProcedure
Define flag, j, a$, event, wb, idx
Dim subitem$(3)
subitem$(0) = "Meier" + #LF$ + "Berlin" + #LF$ + "83"
subitem$(1) = "Bremer" + #LF$ + "Hamburg" + #LF$ + "74"
subitem$(2) = "Müller" + #LF$ + "Bremen" + #LF$ + "92"
subitem$(3) = "Schulze" + #LF$ + "München" + #LF$ + "67"
OpenWindow(#win, 50, 100, 555, 540, "Test", #PB_Window_SystemMenu)
SetWindowCallback(@WinCallback())
ButtonGadget(#bt1, 10, 510, 80, 20,"add")
ButtonGadget(#bt2, 90, 510, 80, 20,"del")
flag = #PB_ListIcon_GridLines
flag | #PB_ListIcon_FullRowSelect
flag | #PB_ListIcon_AlwaysShowSelection
flag | #PB_ListIcon_MultiSelect
ListIconGadget(#lv1, 14, 14, 500, 455, "Sp 0", 50, flag)
AddGadgetColumn(#lv1, 1, "Sp 1", 180)
AddGadgetColumn(#lv1, 2, "Sp 2", 180)
AddGadgetColumn(#lv1, 3, "Sp 3", 65)
SetGadgetFont(#lv1, FontID(1))
HideGadget(#lv1, 1)
For j = 0 To 1000
a$ = Str(j) + #LF$ + subitem$(Random(3))
AddGadgetItem(#lv1, -1, a$)
Next
HideGadget(#lv1, 0)
SetGadgetItemState(#lv1, 1, #PB_ListIcon_Selected)
SetActiveGadget(#lv1)
Repeat: event = WaitWindowEvent()
If event = #PB_Event_Gadget Or event = #PB_Event_Menu
wB = EventGadget()
Select wB
Case #bt1
idx = GetGadgetState(#lv1)
AddGadgetItem(#lv1, idx, "add " + a$)
SetActiveGadget(#lv1)
Case #bt2
idx = GetGadgetState(#lv1)
RemoveGadgetItem(#lv1, idx)
SetGadgetItemState(#lv1, idx, #PB_ListIcon_Selected)
SetActiveGadget(#lv1)
EndSelect
EndIf
Until event = #PB_Event_CloseWindow
End