Dimensionnement des éléments dessinés par le propriétaire

De RAD Studio
Aller à : navigation, rechercher

Remonter à Manipulation des contrôles - Index

Avant de laisser votre application dessiner chaque élément d'un contrôle de taille variable dessiné par le propriétaire, le contrôle reçoit un événement de type TMeasureItemEvent. TMeasureItemEvent indique à l'application l'endroit où l'élément apparaîtra sur le contrôle.

Delphi détermine la taille probable de l'élément (généralement juste assez grand pour afficher le texte de l'élément dans la police de caractères active). Votre application peut gérer l'événement et modifier la zone rectangle choisie. Par exemple, si vous comptez remplacer le texte de l'élément par une image bitmap, vous appliquerez au rectangle la taille du bitmap. Si vous voulez avoir à la fois l'image et le texte, vous ajusterez la taille du rectangle pour qu'il puisse contenir les deux.

Pour changer la taille d'un élément dessiné par le propriétaire, attachez un gestionnaire à l'événement measure-item dans le contrôle dessiné par le propriétaire. Le nom de l'événement peut varier en fonction du contrôle. Les boîtes liste et les boîtes à options utilisent OnMeasureItem. Les grilles n'ont pas ce type d'événement.

L'événement définissant la taille utilise deux paramètres importants : l'indice et la hauteur de l'élément. Cette hauteur est variable : l'application peut l'augmenter ou la diminuer. La position des éléments suivants dépend de la taille des éléments précédents.

Par exemple, dans une boîte liste variable dessinée par le propriétaire, si l'application définit la hauteur du premier élément à cinq pixels, le second élément commence au sixième pixel depuis le haut, et ainsi de suite. Dans les boîtes liste et dans les boîtes à options, le seul aspect des éléments que l'application puisse changer est la hauteur. La largeur de l'élément est toujours celle du contrôle.

Les grilles dessinées par le propriétaire ne peuvent pas modifier la taille des cellules au fur et à mesure qu'elles sont dessinées. En effet, la taille des lignes et des colonnes est définie avant le dessin par les propriétés ColWidths et RowHeights.

Le code suivant, attaché à l'événement OnMeasureItem du composant boîte liste dessinée par le propriétaire, augmente la hauteur de chaque élément de liste pour permettre de placer l'image bitmap associée.



 procedure TFMForm.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
   var Height: Integer);  { Height est un paramètre var}
 var
   BitmapHeight: Integer;
 begin
   BitmapHeight := TBitmap(ListBox1.Items.Objects[Index]).Height;
   { s'assurer que la hauteur de l'élément dispose de suffisamment d'espace, plus deux }
   Height := Max(Height, Bitmap Height +2);
 end;



 void __fastcall TForm1::ListBox1MeasureItem(TWinControl *Control, int Index,
   int &Height)      // remarquez que Height est transmis par adresse
 {
   int BitmapHeight = (dynamic_cast<TBitmap *>(ListBox1->Items->Objects[Index]))->Height + 2;
   // S'assurer que l'élément de la liste est assez haut pour le bitmap (plus deux)
   Height = Max(Height, Bitmap Height +2);
 }



Remarque :  Vous devez transtyper les éléments à partir de la propriété Objects dans la liste de chaînes. Objects est une propriété de type TObject, aussi peut-elle contenir n'importe quel type d'objet. Lorsque vous extrayez un objet d'un tableau, vous devez le transtyper afin qu'il reprenne le type des éléments.