Größe von Owner-Draw-Elementen festlegen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Mit Steuerelementen arbeiten - Index

Bevor Ihre Anwendung die Elemente eines variablen Owner-Draw-Steuerelements zeichnen kann, wird ein Ereignis vom Typ TMeasureItemEvent generiert. Es teilt der Anwendung mit, wo das Element im Steuerelement angezeigt wird.

Delphi ermittelt die Größe des Elements (im Allgemeinen ist es gerade groß genug, um den Text des Elements in der aktuellen Schrift anzuzeigen). Sie können das Ereignis in Ihrer Anwendung behandeln und das gewählte Rechteck ändern. Wenn Sie beispielsweise den Text eines Elements durch eine Bitmap-Grafik ersetzen wollen, passen Sie das Rechteck an die Größe der Grafik an. Sollen Grafik und Text zusammen angezeigt werden, ändern Sie das Rechteck entsprechend der Größe der beiden Elemente.

Sie können die Größe eines Owner-Draw-Elements ändern, indem Sie eine Ereignisbehandlungsroutine für das TMeasureItemEvent-Ereignis bereitstellen. Je nach Steuerelement ist der Name des Ereignisses unterschiedlich. Bei Listen- und Kombinationsfeldern heißt es OnMeasureItem. Bei Datengittern gibt es kein entsprechendes Ereignis.

Dieses Ereignis besitzt zwei wichtige Parameter: Indexnummer und Höhe des betreffenden Elements. Die Höhe ist variabel: Die Anwendung kann sie verkleinern und vergrößern. Die Positionen der nachfolgenden Elemente sind von der Größe der vorhergehenden Elemente abhängig.

Wird beispielsweise bei einem variablen Owner-Draw-Listenfeld die Höhe des ersten Elements auf fünf Pixel eingestellt, beginnt das zweite Element mit dem sechsten Pixel von oben usw. Bei Listen- und Kombinationsfelder kann nur die Höhe der Elemente von der Anwendung geändert werden. Die Breite entspricht immer der Breite des Steuerelements.

Die Zellengröße von Owner-Draw-Datengittern kann beim Zeichnen nicht geändert werden. Sie müssen die Größe der einzelnen Zeilen und Spalten mit den Eigenschaften ColWidths und RowHeights festlegen.

In der folgenden Behandlungsroutine für das Ereignis OnMeasureItem eines Owner-Draw-Listenfelds wird die Höhe der einzelnen Elemente entsprechend der Größe der zugehörigen Bitmap-Grafik geändert:



 procedure TFMForm.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
   var Height: Integer);  { Beachten Sie, dass TabWidth ein als var deklarierter Parameter ist}
 var
   BitmapHeight: Integer;
 begin
   BitmapHeight := TBitmap(ListBox1.Items.Objects[Index]).Height;
   { stellen Sie sicher, dass in der Höhe genügend Platz vorhanden ist (plus 2) }
   Height := Max(Height, Bitmap Height +2);
 end;



 void __fastcall TForm1::ListBox1MeasureItem(TWinControl *Control, int Index,
   int &Height)      // Beachten Sie, dass Height als Referenz übergeben wird
 {
   int BitmapHeight = (dynamic_cast<TBitmap *>(ListBox1->Items->Objects[Index]))->Height + 2;
   // Stellen Sie sicher, dass im Listeneintrag genügend Platz für das Bitmap vorhanden ist (plus 2)
   Height = Max(Height, Bitmap Height +2);
 }



Anmerkung:  Mit den in der Eigenschaft Objects gespeicherten Elementen müssen Sie eine Typumwandlung durchführen. Da die Eigenschaft Objects vom Typ TObject ist, kann sie jede Art von Objekten aufnehmen. Wenn Sie Objekte aus dem Array abrufen, müssen Sie diese wieder in den ursprünglichen Elementtyp konvertieren.