オーナー描画項目を描画する
コントロールの利用:インデックス への移動
オーナー描画コントロールをアプリケーションで描画または再描画しなければならないとき,オペレーティングシステムは,コントロールに表示されている項目ごとに項目を描画するイベントを生成します。対象となるコントロールによって,項目の描画イベントを項目の一部として受け取る場合があります。
オーナー描画コントロールの各項目を描画するには,このコントロールの項目を描画するイベントに対して,イベントハンドラを定義します。
一般に,オーナー描画イベントの名前は次のどちらかから始まります。
- OnDraw(OnDrawItem,OnDrawCell など)
- OnCustomDraw(OnCustomDrawItem など)
- OnAdvancedCustomDraw(OnAdvancedCustomDrawItem など)
項目描画イベントは,描画する項目と描画領域の長方形をパラメータとして持っています。さらに,項目にフォーカスがあるかどうかなど,項目の状態を示すパラメータも持ちます。アプリケーションはイベントを処理して,指定の長方形に適切な項目を描画します。
たとえば次のコードは,タブにビットマップと文字列をどのように描画するかを示しています。このハンドラをリストボックスの OnDrawItem イベントとして定義します。
procedure TFMForm.DriveTabSetDrawTab(Sender: TObject; TabCanvas: TCanvas; R: TRect; Index: Integer; Selected: Boolean); var Bitmap: TBitmap; begin Bitmap := TBitmap(DriveTabSet.Tabs.Objects[Index]); with TabCanvas do begin Draw(R.Left, R.Top + 4, Bitmap); { ビットマップを描画する } TextOut(R.Left + 2 + Bitmap.Width, { キストの位置を決める } R.Top + 2, DriveTabSet.Tabs[Index]); { テキストがビットマップの右に描画されるようにするビットマップ } end; end;
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) TBitmap *Bitmap = (TBitmap *)ListBox1->Items->Objects[Index]; ListBox1->Canvas->Draw(R.Left, R.Top + 2, Bitmap); // ビットマップを描画 ListBox1->Canvas->TextOut(R.Left + Bitmap->Width + 2, R.Top + 2, ListBox1->Items->Strings[Index]); // その右にテキストを書き込む }