2011-06-09 27 views
1

我想用灰色將一行着色,另一行用白色着色。
我有以下代碼,但在Windows 7中有垂直行的空白區域。
如何爲所有行着色?在vsReport模式下的ListView項目和行的着色

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; 
+0

我合併兩個帳戶在一起。 [請閱讀關於基於cookie的帳戶的這個Faq條目。](http://meta.stackexchange.com/questions/44557/why-should-i-register-my-account/1228) – Will 2011-06-09 16:33:12

回答

9

OwnerDrawtrue並添加

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; 

Screenshot http://privat.rejbrand.se/listviewrowcolors.png

在上面的例子中,第一列是左對齊並且兩個其他居中。

如果你只有一列,即,無子:

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; 
+1

稍微有點多(它)(以及這取決於你的具體情況),但這應該讓你開始,至少。 – 2011-06-09 15:52:37

+0

如果我在SubItem中沒有文字該怎麼辦?以及如何爲項目繪製圖像?謝謝。 – Michael 2011-06-09 19:05:34

+0

如果您沒有任何子項,則只有一列。然後它更容易。您只需刪除上面幾行代碼即可。 – 2011-06-09 19:42:01

相關問題