这样才行procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  R: TRect;
begin  if Item.Index mod 2 = 0  then
    ListView1.Canvas.Brush.color := clAqua
  else
    ListView1.Canvas.Brush.color := clWhite;
  if cdsSelected in state then
    ListView1.Canvas.Brush.Color := clRed;
  R := Item.DisplayRect(drBounds);
  ListView1.Canvas.FillRect(R);
  ListView1.Canvas.TextOut(R.Left + 1, R.Top + 1, Item.Caption);
  DefaultDraw:= False;
end;

解决方案 »

  1.   

    谢谢prometheusphinx(白日梦)!但此时SubItem没有绘出,应该怎么解决?谢谢!
      

  2.   

    参看下面 的方法
    var
      i                 : integer;
      r                 : TRect;
      s                 : string;
    begin
      with Sender.Canvas do
      begin
        if odSelected in state then
        begin
          Brush.Color := clNavy;
          Font.Color := clWhite;
        end
        else
        begin
          Brush.Color := clWhite;
          Font.Color := clBlack;
        end;
        r := rect;    fillRect(r);
        if (item.SubItems[colReadFlag] <> '1') and
          (TreeView1.Selected.Index = 0) then
        begin
          Font.Style := [fsBold];
          r.Right := r.Left + Sender.Column[0].Width;
          s := item.Caption;
          if Length(s) > Sender.Column[0].Width div TextWidth('A') - 3 then
            s := Copy(s, 1, Sender.column[0].Width div TextWidth('A') - 3) +
              '...';
          TextOut(r.Left, r.Top, s);
          r.left := r.right;
          for i := 0 to item.SubItems.Count - 1 do
          begin
            if Sender.Column[i + 1].Width <> 0 then
            begin
              r.Right := r.Right + Sender.Column[i + 1].Width;          s := item.subitems[i];
              if Sender.Canvas.TextWidth(s) > Sender.Column[i + 1].Width then
                s := Copy(s, 1, Sender.column[i + 1].Width div TextWidth('A')
                  - 3) + '...';
              TextOut(r.Left, r.Top, s);
              r.Left := r.Right;
            end;      end;
        end
        else
        begin
          Font.Style := [];
          r.Right := r.Left + Sender.Column[0].Width;
          s := item.Caption;
          if Length(s) > Sender.Column[0].Width div TextWidth('A') - 3 then
            s := Copy(s, 1, Sender.column[0].Width div TextWidth('A') - 3) +
              '...';
          TextOut(r.Left, r.Top, s);
          r.left := r.right;
          for i := 0 to item.SubItems.Count - 1 do
          begin
            if Sender.Column[i + 1].Width <> 0 then
            begin
              r.Right := r.Right + Sender.Column[i + 1].Width;          s := item.subitems[i];
              if Sender.Canvas.TextWidth(s) > Sender.Column[i + 1].Width then
                s := Copy(s, 1, Sender.column[i + 1].Width div TextWidth('A')
                  - 3)
                  + '...';
              TextOut(r.Left, r.Top, s);
              r.Left := r.Right;
            end;      end;
        end;
      end;end;
      

  3.   

    老虎老虎!!你试试!我这边成功啦!procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
     var R:TREct;
     var i:integer;
    begin
      if Item.Index mod 2 = 0  then
        ListView1.Canvas.Brush.color := clAqua
      else
        ListView1.Canvas.Brush.color := clWhite;
      if cdsSelected in state then
      begin
            ListView1.Canvas.Brush.Color := clRed;
            R := Item.DisplayRect(drBounds);
            ListView1.Canvas.FillRect(R);
            ListView1.Canvas.TextOut(R.Left + 1, R.Top + 1, Item.Caption);
            For i:=0 to Item.SubItems.Count-1 do
            begin
                    R.Left:=R.Left+ListView1.Columns[i].Width;
                    ListView1.Canvas.TextOut(R.Left+1,R.Top+1,Item.SubItems.Strings[i]);
                    DefaultDraw:= False;
            end;
      end;
    end;
      

  4.   

    非常感谢 prometheusphinx(白日梦) 和 ch81(missile) 两位高手的帮助,给两位送上分数。
    再次感谢!
      

  5.   

    procedure TMainForm.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
      if odd(Item.Index) then
        ListView1.Canvas.Brush.color := clAqua
      else
        ListView1.Canvas.Brush.color := clWhite;
      ListView1.Canvas.FillRect(drBounds);
    end;