AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>コントロールをオーナードローで描画する
Delphi Tips
Delphi Win32API
ダウンロード

Delphi Tips & Tricks

コントロールをオーナードローで描画する

 ただテキストが表示されている TListBoxや TComboBoxもいいですが、やはりアイコンがあったり、テキストの意味を補佐する画像があるとかっこいいですよね。少し凝ったデザイン(たとえばテキストの横にアイコンつきとか)を、表示するためにVCLのオーナードローの使い方を覚えましょう。
//塗りつぶしを選択するコンボボックス
//テキストの左に模様見本を表示
procedure TForm1.FormCreate(Sender: TObject);
begin
  //本来は設計時に追加してください。ここから..
  with ComboBox1 do begin
    Width :=150;
    //オーナードローに
    Style :=csOwnerDrawFixed; 
    ItemHeight :=20;
    
    Items.Add('bsSolid');
    Items.Add('bsClear');
    Items.Add('bsHorizontal');
    Items.Add('bsVertical');
    Items.Add('bsFDiagonal');
    Items.Add('bsBDiagonal');
    Items.Add('bsCross');
    Items.Add('bsDiagCross');
    
    ItemIndex  :=0;
  end; //with ここまで
end;

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  CB :TComboBox;
begin
  CB :=Control as TComboBox; //型キャスト

  with CB.Canvas do begin
    FillRect(Rect);
    Pen.Color   :=clBlack;
    Brush.Color :=clGray;

    case index of
    0:Brush.Style :=bsSolid;
    1:Brush.Style :=bsClear;
    2:Brush.Style :=bsHorizontal;
    3:Brush.Style :=bsVertical;
    4:Brush.Style :=bsFDiagonal;
    5:Brush.Style :=bsBDiagonal;
    6:Brush.Style :=bsCross;
    7:Brush.Style :=bsDiagCross;
    end;

    if (odSelected in State) or (odFocused in State) then
     Canvas.Font.Color :=clWhite
    else
     Canvas.Font.Color :=clBlack;

   //模様の四角形を描く
   Rectangle(Rect.Left+2 ,Rect.Top+1 ,Rect.Left+30 ,Rect.Bottom-1);
   //テキスト描画時には背景を透明に
   Brush.Style :=bsClear;
   //テキスト描画
   Textout(Rect.Left+34 ,Rect.Top+2,CB.Items[Index]);
  end; //with
end;

OnDrawItemイベントで渡されるパラメータについて説明します。

Control: TWinControl
描画するコントロールを表します。このコントロールの Canvasプロパティを使って独自に描画することになります。
Index: Integer
描画する対象が何番目の項目かを示しています。番号は 0ベースです。(0番目から始まります)
Rect: TRect
描画する対象の項目の長方形を表しています。描画の際注意することはコントロールの外矩形ではなく、描画対象の項目1つを囲む長方形だということです。
State: TOwnerDrawState
現在の描画対象の項目の、状態を表すフラグの組み合わせが入っています。
たとえば無効だったり、選択状態だったりなど、ということです。詳しくは下表を参照してください。
項目の状態(TOwnerDrawState)・・・主要なものだけ
odSelected //選択状態(反転表示)である
odGrayed //淡色表示(グレー表示)されている
odDisabled //無効状態である
odChecked //チェックされている
odFocused //フォーカスがある
odDefault //デフォルト(太字表示)の項目である

オーナードローで描画すると項目の数だけこのイベントが起こります。たとえば100個のアイテムがあるコントロールでは、1度に100回このイベントが呼ばれることになります。この点に注意して描画コードを書くようにしましょう。