I'm redrawing a listbox just to put a background color on alternate line in "listing style". The underlying process, without using %NM_CUSTOMDRAW, takes 0.8 seconds or thereabouts. When the customdraw feature is added, it takes 2.4 seconds - that's madness, surely. Or more likely, my code (derived from MCM's example ISTR) is wrong:
Code:
' CASE %NM_CUSTOMDRAW ' set bg color' ' IF LOWRD(CBWPARAM) <> %IDC_QR_LV THEN EXIT SELECT ' pnm = CBLPARAM ' SELECT CASE @pnm.nmcd.dwDrawStage ' CASE %CDDS_PREPAINT ' SetWindowLong CBHNDL,%DWL_MSGRESULT,%CDRF_NOTIFYITEMDRAW ' FUNCTION = 1: EXIT FUNCTION ' CASE %CDDS_ITEMPREPAINT ' SetWindowLong CBHNDL,%DWL_MSGRESULT,%CDRF_NOTIFYSUBITEMDRAW ' FUNCTION = 1: EXIT FUNCTION ' CASE %CDDS_SUBITEM OR %CDDS_ITEMPREPAINT ' FUNCTION = [B]QLVCustomDraw(BYVAL pnm)[/B] ' EXIT FUNCTION ' END SELECT
Code:
'------------------------------------------------------------------------------ FUNCTION QLVCustomDraw ( BYVAL ptlvcd AS NMLVCUSTOMDRAW PTR ) AS LONG LOCAL szItem AS ASCIIZ * %MAX_PATH ' item text LOCAL trcItem AS RECT ' bounding rectangle of item/subitem LOCAL tlv_item AS LV_ITEM ' listview item information LOCAL tlb AS LOGBRUSH ' specifies information used to create background brush LOCAL hWndHdr AS DWORD ' handle of header child control LOCAL hBrush AS DWORD LOCAL hBrushOld AS DWORD LOCAL hPenOld AS DWORD LOCAL dwBackColor AS DWORD LOCAL nBkModeOld AS INTEGER LOCAL hwin AS DWORD LOCAL lresult AS LONG ' Get the item or subitem info tlv_item.mask = %LVIF_TEXT OR %LVIF_IMAGE OR %LVIF_STATE tlv_item.stateMask = %LVIS_FOCUSED OR %LVIS_SELECTED tlv_item.iItem = @ptlvcd.nmcd.dwItemSpec tlv_item.iSubItem = @ptlvcd.iSubItem tlv_item.pszText = VARPTR(szItem) tlv_item.cchTextMax = %MAX_PATH SendMessage @ptlvcd.nmcd.hdr.hwndFrom, %LVM_GETITEM, 0, BYVAL VARPTR(tlv_item) ' Get the bounding rectangle of the subitem(cell) trcItem.nLeft = %LVIR_BOUNDS trcItem.nTop = @ptlvcd.iSubItem lresult = SendMessage( @ptlvcd.nmcd.hdr.hwndFrom, %LVM_GETSUBITEMRECT, @ptlvcd.nmcd.dwItemSpec, BYVAL VARPTR(trcItem)) ' Color the background IF @ptlvcd.nmcd.dwItemSpec MOD 2 = 0 THEN dwBackColor = RGB(255,225,225) ' background ELSE dwBackColor = %WHITE ' white background END IF tlb.lbStyle = %BS_SOLID tlb.lbColor = dwBackColor tlb.lbHatch = 0 hBrush = CreateBrushIndirect(tlb) FillRect @ptlvcd.nmcd.hdc, trcItem, hBrush DeleteObject hBrush ' Draw the text nBkModeOld = SetBkMode(@ptlvcd.nmcd.hdc, %TRANSPARENT) DrawTextEx @ptlvcd.nmcd.hdc, szItem, LEN(szItem), trcItem, %DT_SINGLELINE OR %DT_LEFT OR %DT_VCENTER OR %DT_END_ELLIPSIS, BYVAL %NULL SetBkMode @ptlvcd.nmcd.hdc, nBkModeOld FUNCTION = %CDRF_SKIPDEFAULT END FUNCTION
Comment