Dessin des éléments de dessin propriétaire

De RAD Studio
Aller à : navigation, rechercher

Remonter à Ajout de graphiques à des contrôles

Lorsqu’une application doit dessiner ou redessiner un contrôle dessiné par le propriétaire, le système d’exploitation génère un événement de type draw-item pour chaque élément visible du contrôle. Selon le contrôle, l’élément peut également recevoir les événements de dessin pour l'élément en tant que partie de l'élément.

Pour dessiner chaque élément d’un contrôle dessiné par le propriétaire, attachez un gestionnaire à l’événement draw-item de ce contrôle.

Les noms des événements relatifs aux objets dessinés par le propriétaire commencent généralement par :

  • OnDraw, comme OnDrawItem ou OnDrawCell
  • OnCustomDraw, comme OnCustomDrawItem
  • OnAdvancedCustomDraw, comme OnAdvancedCustomDrawItem

L’événement draw-item contient des paramètres identifiant l’élément à dessiner, le rectangle dans lequel il s’inscrit et, habituellement, des informations sur son état (actif, par exemple). L’application gère chaque événement en plaçant l’élément approprié dans le rectangle transmis.

Par exemple, le code suivant montre comment dessiner des éléments dans une boîte liste ayant un bitmap associé à chaque chaîne. Il attache ce gestionnaire à l’événement 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);  { draw bitmap }
  	 TextOut(R.Left + 2 + Bitmap.Width,  { position text }
    	 R.Top + 2, DriveTabSet.Tabs[Index]);  { and draw it to the right of the bitmap }
   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); // draw the bitmap
	ListBox1->Canvas->TextOut(R.Left + Bitmap->Width + 2, R.Top + 2,
			ListBox1->Items->Strings[Index]); // and write the text to its right
}