TPaintbox et TImage

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 6 mai 2009 à 20:47
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 7 mai 2009 à 13:50
Hello
Je m'apprête à m'amuser avec une TPaintbox, et déjà j'ai lu que peindre sur le canvas d'une TImage est mieux, question de refresh/repaint.
J'ai donc essayé avec les 2 compos et effectivement, avec le TImage, le refresh est correct.
Par contre ! Avec le TImage, le fond devient blanc dès mon premier .Draw !
Voici le code simple que j'utilise :

procedure TForm1.Button1Click(Sender: TObject);
var fBMP: TBitmap;
begin
  fBMP:= TBitmap.Create;
  fBMP.LoadFromFile('c:\monimage.bmp')
  fBMP.Transparent:= true;
  Paintbox1.Canvas.Draw(0,0,fBMP);
  Image1.Canvas.Draw(0,0,fBMP);
  FreeAndNil(fBMP);
end;

Comment faire donc pour ne pas avoir ce fond blanc ? Et petite question qui est dans le ton du moment : si je désire par la suite utiliser de la transparence canal alpha (pnglib), le code sera-t-il tres différent ?

Merci à tous

5 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
6 mai 2009 à 23:26
Peindre sur le canvas d'un TImage c'est mieux ??!

TPaintBox -> TGraphicControl
TImage -> TGraphicControl

methode Paint de TPaintBox :

procedure TPaintBox.Paint;
begin
  Canvas.Font := Font;
  Canvas.Brush.Color := Color;
  if csDesigning in ComponentState then
    with Canvas do
    begin
      Pen.Style := psDash;
      Brush.Style := bsClear;
      Rectangle(0, 0, Width, Height);
    end;
  if Assigned(FOnPaint) then FOnPaint(Self);
end;

methode Paint de TImage :

procedure TImage.Paint;
var
  Save: Boolean;
begin
  if csDesigning in ComponentState then
    with inherited Canvas do
    begin
      Pen.Style := psDash;
      Brush.Style := bsClear;
      Rectangle(0, 0, Width, Height);
    end;
  Save := FDrawing;
  FDrawing := True;
  try
    with inherited Canvas do
      StretchDraw(DestRect, Picture.Graphic);
  finally
    FDrawing := Save;
  end;
end;

a propos de TPaintBox :
Utilisez TPaintBox pour ajouter des images personnalisées à une fiche. A la
différence de TImage qui affiche une image stockée dans un bitmap, une icône ou
un métafichier, TPaintBox attend de l'application qu'elle dessine l'image
directement dans un canevas. Utilisez le gestionnaire d'événement OnPaint pour
dessiner dans la surface de dessin (Canvas) de la boîte à peindre.

a propos de TImage :
Utilisez TImage pour afficher une image graphique dans une
fiche. Utilisez l'objet TPicture de la propriété Picture pour spécifier l'objet
bitmap, icône, métafichier ou autre objet graphique qui est affiché par TImage.
Les propriétés et méthodes de TPicture permettent par exemple de charger une
image à partir d'un fichier, d'effacer l'image de l'objet TImage et d'affecter
une image à un autre contrôle. TImage introduit diverses propriétés permettant
de déterminer comment l'image est affichée à l'intérieur de l'objet
TImage.Pour ajouter une image dans une fiche ou un
module de données afin qu'elle soit affichée par d'autres contrôles, tels que
des listes d'actions et des boutons bitmap, utilisez un contrôle
TImageList.

deux composant donc totalement opposé dans leurs utilisation.

et TPaintBox est clairement pus pratique que TImage pour ce qui est de dessiner sur une fiche sans utiliser le canvas de la fiche.

TPaintBox possede un evenement Paint
TImage n'en possede pas

TPaintBox s'utilise facilement avec un TTimer
TImage nous contraint a faire quelque pirouettes si on veux l'utiliser avec un TTimer

J'utilise la propriété Canvas de TPaintBox quand je veux dessiner
Je dois utiliser Image.Picture.Bitmap.Canvas quand je veux dessiner dans un TImage tout en gerant son evenement OnProgress... ou en utilisant un Bitmap externe a TImage assigné a la fin au Bitmap de TImage ... interet ? aucun.

0
Rejoignez-nous