Dessin des éléments de dessin propriétaire
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
}