ListView in vsReport mode colouring of Items and rows

前端 未结 1 1350
野的像风
野的像风 2020-12-06 15:40

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

相关标签:
1条回答
  • 2020-12-06 16:02

    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 - 1];
        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;
    
    Screenshot

    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;
    
    0 讨论(0)
提交回复
热议问题