Delphi TListView の OwnerDraw で選択状態以外を自前で記述

 ListView の Item に自前の文字を記述したいけど、選択状態などは元々の処理を使いたい

ListView  プロパティ
OwnerData: True // アイテムを表示させない
OwnerDraw: False // Trueにすると選択状態も自前で書かなくてはなりません

AdvancedCustomDrawItem イベント
procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var
    R: TRect;
begin
    if (Stage = cdPostPaint) or (Stage = cdPostErase) then begin
        R := Item.DisplayRect(drBounds);

        Sender.Canvas.Brush.Style := bsClear; // 文字背景を透過
        Sender.Canvas.Font.Color := clBlack;
        Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsBold];
        Sender.Canvas.TextOut(R.Left + 1, R.Top + 1, Item.Caption);
    end;
end;
cdPostPaint or cdPostErase 時に描画することで、選択状態等、元々の描画が終わった後に自前の文字を書き込んでいる

リストの高さは、ImageList(中身は空でもよい)を割り付けて、イメージの高さを目的の数値にすればok

コメント