$include "windowssdk.inc" TYPE NMCUSTOMDRAWINFO NMHDR hdr UINT dwDrawStage UINT hDC WINRECT rc UINT dwItemSpec UINT uItemState UINT lItemlParam ENDTYPE TYPE NMLVCUSTOMDRAW NMCUSTOMDRAWINFO nmcd UINT clrText UINT clrTextBk INT iSubItem ENDTYPE 'Required Constants CONST LVM_SETEXTENDEDLISTVIEWSTYLE=(0x1000+54) 'LVM_FIRST=0x1000 CONST LVS_EX_FULLROWSELECT=0x20 CONST LVS_EX_GRIDLINES=1 CONST CDRF_DODEFAULT=0 CONST CDDS_ITEM=0x10000 CONST CDDS_PREPAINT=1 CONST CDDS_ITEMPREPAINT=(CDDS_ITEM|CDDS_PREPAINT) CONST CDDS_SUBITEM=0x20000 CONST CDDS_SUBITEMPREPAINT=(CDDS_SUBITEM|CDDS_ITEMPREPAINT) CONST CDRF_NOTIFYITEMDRAW=0x20 CONST CDRF_NOTIFYSUBITEMDRAW=0x20 CONST CDRF_NEWFONT=2 CONST NM_CUSTOMDRAW=(0-12) 'NM_FIRST=0 'ID of Listview CONST LVIEW=100 WINDOW win INT loop UINT currentColour,hLV,origFp UINT colour1=0xF2E4D7 'Text row background, even rows - light blue - swap if required for light grey 'UINT colour1=0xF0F0F0 'Text row background, even rows - light grey UINT colour2=0xFFFFFF 'Text colour, all rows UINT colour3=0x000000 'Text row background, odd rows OpenWindow win,0,0,800,600,@MINBOX|@MAXBOX|@CAPTION|@SYSMENU,0,"Listview Example",&win_handler SETWINDOWCOLOR win,RGB(240,240,240) CONTROL win,@LISTVIEW,"",10,10,774,552,@LVSREPORT|@BORDER,LVIEW SENDMESSAGE win,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES,LVIEW SETFONT win,"Segoe UI",10,400,0,LVIEW 'Set Listview header text CONTROLCMD win,LVIEW,@LVINSERTCOLUMN,0,"Info" CONTROLCMD win,LVIEW,@LVINSERTCOLUMN,1,"Details" CONTROLCMD win,LVIEW,@LVINSERTCOLUMN,2,"Description" 'Set Listview column widths CONTROLCMD win,LVIEW,@LVSETCOLWIDTH,0,150 CONTROLCMD win,LVIEW,@LVSETCOLWIDTH,1,200 CONTROLCMD win,LVIEW,@LVSETCOLWIDTH,2,-2 'Put some data into the Listview FOR loop=0 TO 30 CONTROLCMD win,LVIEW,@LVINSERTITEM,loop,"Computer Name" CONTROLCMD win,LVIEW,@LVSETTEXT,loop,1,"Name of computer, if set" CONTROLCMD win,LVIEW,@LVSETTEXT,loop,2,"The computer name of the current system" NEXT loop 'Get Listview handle for sub-classing hLV=GetDlgItem(win.hWnd,1) origFp=GetWindowLongA(hLV,GWL_WNDPROC) 'Replace it with our handler... SetWindowLongA(hLV,GWL_WNDPROC,&myLVHandler) WAITUNTIL ISWINDOWCLOSED(win) END SUB win_handler(),INT SELECT @MESSAGE CASE @IDCREATE CENTERWINDOW win CASE @IDCLOSEWINDOW CLOSEWINDOW win CASE @IDCONTROL SELECT @NOTIFYCODE CASE NM_CUSTOMDRAW RETURN ColourListView(win.hWnd,@LPARAM) 'Colour the Listview items ENDSELECT ENDSELECT RETURN 0 ENDSUB SUB myLVHandler(hWnd:UINT,uMsg:UINT,wParam:UINT,lParam:POINTER),INT SELECT uMsg CASE WM_NOTIFY RETURN CDRF_DODEFAULT ENDSELECT RETURN CallWindowProcA(origFp,hWnd,uMsg,wParam,lParam) ENDSUB SUB ColourListView(hWnd:UINT,lParam:UINT),UINT row=*lParam.nmcd.dwItemSpec IF (row % 2) THEN currentColour=colour2 ELSE currentColour=colour1 SELECT *lParam.nmcd.dwDrawStage CASE CDDS_PREPAINT rv=CDRF_NOTIFYITEMDRAW CASE CDDS_ITEMPREPAINT rv=CDRF_NOTIFYSUBITEMDRAW CASE CDDS_SUBITEMPREPAINT *lParam.clrText=colour3 *lParam.clrTextBk=currentColour rv=CDRF_NEWFONT DEFAULT rv=CDRF_DODEFAULT ENDSELECT RETURN rv ENDSUB