Delphiメモ

No015:ListViewでCheckBoxがある時のOwnerDraw

オーナードローっていうのは描画処理をWindowsに任せることなくプログラム側が行うことを指す。
要するに自前の処理でメニューやリストの描画を行うことが出来るわけ。

で、ListViewでオーナードローを行うなら、まずOwnerDrawプロパティをTrueにするのが定石だけど、
CheckboxesプロパティがTrueの場合チェックボックスも自分で書かなきゃならないので面倒。
チェックボックスだけをWindowsに描画させ、その他のアイテムをオーナードローにするにはOnCustomDrawSubItemイベントを使う。

OnCustomDrawSubItemイベントはOwnerDrawプロパティがFalseでも発生する。
このイベントハンドラ内にSubItemについての描画処理を記述すれば、
チェックボックスのみWindowsに描画されSubItemは自前の描画処理が行われる。
ただし、Captionの描画はWindowsによって行われるため、
Captionを空にして、チェックボックスのみにしなければならないのが欠点。
とりあえず以下に例を示す。

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
 Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  //選択中は太字
  if Item.Selected = True then
  begin
    ListView1.Canvas.Font.Style:= [fsBold];
    ListView1.Canvas.Brush.Color:= clHighlight;
    ListView1.Canvas.Font.Color:= clHighlightText;
  end
  else
  begin
    //チェック項目は赤、その他は黒
    if Item.Checked = True then
    begin
      ListView1.Canvas.Font.Style:= [];
      ListView1.Canvas.Brush.Color:= clWhite;
      ListView1.Canvas.Font.Color:= clRed;
    end
    else
    begin
      ListView1.Canvas.Font.Style:= [];
      ListView1.Canvas.Brush.Color:= clWhite;
      ListView1.Canvas.Font.Color:= clBlack;
    end;
  end;
end;

選択中のアイテムは太字で反転表示され、
チェック付きのアイテムは文字色が赤、
その他のアイテムは文字色が黒で表示されるはず。

トップに戻る

関連ページ