ListView in vsReport mode colouring of Items and rows

China☆狼群 提交于 2019-11-27 06:32:37

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!