Owner-Draw-Elemente anzeigen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Mit Steuerelementen arbeiten - Index


Wenn in einer Anwendung ein Owner-Draw-Steuerelement angezeigt oder aktualisiert werden muss, wird für jedes sichtbare Element des Steuerelements ein entsprechendes Ereignis generiert. In Abhängigkeit vom Steuerelement kann das Element Ereignisse für das Element insgesamt oder für Teilelemente empfangen.

Wenn Sie alle Elemente des Steuerelements anzeigen wollen, erstellen Sie eine Behandlungsroutine für dieses Ereignis.

Die Namen der Ereignisse beginnen normalerweise mit folgenden Silben:

  • OnDraw wie in OnDrawItem oder OnDrawCell
  • OnCustomDraw wie in OnCustomDrawItem
  • OnAdvancedCustomDraw wie in OnAdvancedCustomDrawItem

Einer Behandlungsroutine für ein OnDraw-Ereignis müssen drei Parameter übergeben werden: das anzuzeigende Element, das Rechteck, in dem es angezeigt wird, und der Elementstatus (z.B. ob das Element den Fokus hat). Die Anwendung gibt das Element im angegebenen Rechteck aus.

Im folgenden Beispiel werden Elemente in einem Listenfeld angezeigt, in dem jedem String ein Bitmap zugeordnet ist. Die Routine wird dem Ereignis OnDrawItem des Listenfelds zugeordnet:


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);  { Bitmap zeichnen}
 	 TextOut(R.Left + 2 + Bitmap.Width,  { Text positionieren }
   	 R.Top + 2, DriveTabSet.Tabs[Index]);  { und rechts neben der Bitmap-Grafik zeichnen }
  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); // Bitmap zeichnen
  ListBox1->Canvas->TextOut(R.Left + Bitmap->Width + 2, R.Top + 2,
    ListBox1->Items->Strings[Index]);        // und Text rechts daneben schreiben
}