0

リストビューのサブアイテムのテキストを変更したら、行全体をブラシで塗りつぶす必要があります。

procedure TForm1.ListViewDrawItem(Sender: TCustomListView;
  Item: TListItem; Rect: TRect; State: TOwnerDrawState);
begin
  if Item.SubItems[2]='Done'
   then
  begin
    Sender.Canvas.Font.Color := clBlack;
    Sender.Canvas.Brush.Color := clGreen;
    Sender.Canvas.Brush.Style := bsSolid;
    Sender.Canvas.FillRect(Rect);
  end;
end;

しかし、Sender.Canvas。FillRect(Rect)は、SubItemのRectのみを埋めます。行全体を埋める方法は?

質問はDelphiに基づいて行われます:CustomDrawItemのリストビューで小さなアイコンを描画する方法

ありがとう!

4

1 に答える 1

5

まず、3つの列がある場合、それらは、、、CaptionおよびSubItems[0]ですSubItems[1]、覚えていますか?ありませんSubItems[2]

とにかく、これはとても簡単です。必要なのは、古いコードのごくわずかな変更だけです。

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 SameText(Item.SubItems[1], 'done') then
  begin
    Sender.Canvas.Font.Color := clBlack;
    Sender.Canvas.Brush.Color := clLime;
  end
  else
    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;
  Sender.Canvas.Draw(3, r.Top + (r.Bottom - r.Top - bm.Height) div 2, bm);
  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
    begin
      S := Item.Caption;
      r.Left := bm.Width + 6;
    end
    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;

スクリーンショット

特に、背景のテキストがひどいように見えるので、clLimeの代わりに使用していることに注意してください。ただし、背景のテキストを検討することもできます。clGreenclBlackclGreenclWhiteclGreen

スクリーンショット

コメントに応じて更新します。

リストビューの3番目の列を変更するには、単に行うだけではありません。

procedure TForm1.FormClick(Sender: TObject);
begin
  ListView1.Items[3].SubItems[1] := 'Done';
end;

実際、Windowsは、1つの列のデータが行全体の外観に影響を与えることを認識していません。最も簡単な修正は、値を変更したときにコントロール全体を再描画するようにWindowsに指示することです。より良い:現在の行を再描画するようにWindowsに指示するだけです:

procedure TForm1.FormClick(Sender: TObject);
begin
  ListView1.Items[3].SubItems[1] := 'Done';
  ListView1.Items[3].Update;
end;
于 2011-07-07T21:00:41.197 に答える