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

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

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

AdvancedCustomDrawItem イベント
  1. procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; var DefaultDraw: Boolean);  
  2. var  
  3.     R: TRect;  
  4. begin  
  5.     if (Stage = cdPostPaint) or (Stage = cdPostErase) then begin  
  6.         R := Item.DisplayRect(drBounds);  
  7.   
  8.         Sender.Canvas.Brush.Style := bsClear; // 文字背景を透過  
  9.         Sender.Canvas.Font.Color := clBlack;  
  10.         Sender.Canvas.Font.Style := Sender.Canvas.Font.Style + [fsBold];  
  11.         Sender.Canvas.TextOut(R.Left + 1, R.Top + 1, Item.Caption);  
  12.     end;  
  13. end;  
cdPostPaint or cdPostErase 時に描画することで、選択状態等、元々の描画が終わった後に自前の文字を書き込んでいる

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

コメント