问题
I want to color one row in gray and the other in white.
I have the following code but there is white space of vertical lines of columns in Windows 7.
How do I color all rows?
procedure TForm2.Update_ListBoxCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin if Item.Index mod 2=0 then begin Sender.Canvas.Font.Color:=clBlack; Sender.Canvas.Brush.Color:=$F6F6F6; end else begin Sender.Canvas.Font.Color:=clBlack; Sender.Canvas.Brush.Color:=clWhite; end; end;
回答1:
Set OwnerDraw
to true
and add
procedure TForm1.ListView1DrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState); var i: Integer; x1, x2: integer; r: TRect; S: string; const DT_ALIGN: array[TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER); begin if Odd(Item.Index) then begin Sender.Canvas.Font.Color := clBlack; Sender.Canvas.Brush.Color := $F6F6F6; end else begin Sender.Canvas.Font.Color := clBlack; Sender.Canvas.Brush.Color := clWhite; end; Sender.Canvas.Brush.Style := bsSolid; Sender.Canvas.FillRect(Rect); x1 := 0; x2 := 0; r := Rect; Sender.Canvas.Brush.Style := bsClear; for i := 0 to ListView1.Columns.Count - 1 do begin inc(x2, ListView1.Columns[i].Width); r.Left := x1; r.Right := x2; if i = 0 then S := Item.Caption else S := Item.SubItems[i]; DrawText(Sender.Canvas.Handle, S, length(S), r, DT_SINGLELINE or DT_ALIGN[ListView1.Columns[i].Alignment] or DT_VCENTER or DT_END_ELLIPSIS); x1 := x2; end; end;

In the above example, the first column is left-aligned and the two other are centered.
If you only have one column, that is, no subitems:
procedure TForm1.ListView1DrawItem(Sender: TCustomListView; Item: TListItem; Rect: TRect; State: TOwnerDrawState); var r: TRect; S: string; const DT_ALIGN: array[TAlignment] of integer = (DT_LEFT, DT_RIGHT, DT_CENTER); begin if odd(Item.Index) then begin Sender.Canvas.Font.Color:=clBlack; Sender.Canvas.Brush.Color:=$F6F6F6; end else begin Sender.Canvas.Font.Color:=clBlack; Sender.Canvas.Brush.Color:=clWhite; end; Sender.Canvas.Brush.Style := bsSolid; Sender.Canvas.FillRect(Rect); r := Rect; Sender.Canvas.Brush.Style := bsClear; S := Item.Caption; DrawText(Sender.Canvas.Handle, S, length(S), r, DT_SINGLELINE or DT_ALIGN[ListView1.Columns[0].Alignment] or DT_VCENTER or DT_END_ELLIPSIS); end;
来源:https://stackoverflow.com/questions/6294985/listview-in-vsreport-mode-colouring-of-items-and-rows