TPaintbox et TImage

Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
- - Dernière réponse : f0xi
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
- 7 mai 2009 à 15:59
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
Afficher la suite 

6 réponses

Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
25
0
Merci
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.

Commenter la réponse de f0xi
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
26 juillet 2018
11
0
Merci
Salut,



C'est pas que je veux ramener ma fraise après fOxi mais chez moi, Messieurs les Administrateurs, cocher "surveiller cet échange" c'est comme pisser dans un TColor.


Bref, 'faut que je cause pour être informé; car ce sujet m'intéresse...





Donc, perso, j'utilise TImage pour les images et TPaintBox quand je veux dessiner.
C'est pas toujours contradictoire et chacun a ses avantages et ses inconvénients je trouve.

Merci
Commenter la réponse de Caribensila
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
11
0
Merci
Donc tout compte fait, le TPaintBox est mieux quand même, mais euh ... avec mon ptit bout de code, une fois l'application réduite puis restaurée, les dessins dans le TPaintBox ont disparu, pas dans le TImage, c'est aussi pour ça que j'ai testé avec le TImage.
Donc je reprends mes 2 premières questions restées sans réponse et j'en ajoute 2.

Comment faire donc pour ne pas avoir ce fond blanc ?
Si je désire par la suite utiliser de
la transparence canal alpha (pnglib), le code sera-t-il tres différent ?
Comment faire pour que le TPaintbox se refresh correctement comme une TImage ?
Ou alors, sachant que je ne vais pas dessiner mais plutot charger des bmp que je vais "coller" sur le canvas, dois je vraiment utiliser paintbox ou timage suffirait ?

Merci
Commenter la réponse de JulioDelphi
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
25
0
Merci
Comment faire donc pour ne pas avoir ce fond blanc ?



On peu dériver la méthode Paint de TImage sans y mettre d'inherited (valable aussi pour TPaintBox)

Si je désire par la suite utiliser de la transparence canal alpha (pnglib), le code sera-t-il tres différent ?

Non. ormis le code pour manipuler le canal alpha d'un PNG, ça restera du Canvas.Draw(...) etc.

Comment faire pour que le TPaintbox se refresh correctement comme une TImage ?

tu doit utiliser l'evenement OnPaint de TPaintBox ou deriver la methode Paint. ensuite placer un TPaintBox.Invalidate a ou il faut (Form.OnShow etc) mais bizarement ça ne devrait pas poser de probleme...
je n'ai jamais eu ce cas, mais en même temps j'utilise toujours TPainBox avec un TTimer reglé entre 30 et 60ms.

Ou
alors, sachant que je ne vais pas dessiner mais plutot charger des bmp
que je vais "coller" sur le canvas, dois je vraiment utiliser paintbox
ou timage suffirait ?

Pour cela, TImage est plus approprié, puisque si il n'y a pas d'interraction directe avec l'image affichée (souris, clavier etc) il n'est pas necessaire d'utiliser TPaintBox. Par exemple, TImage peut etre utiliser pour un logiciel d'effet sur image (grayscale, emboss, blur, sharpen, resample, resize, crop etc).
TPaintBox se prete plus au jeux avec GDI, GDI+, Timer, OpenGl, DirectX, Sprites, Gibs, Animation en general.

Commenter la réponse de f0xi
Messages postés
2354
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
11
0
Merci
Merci foxy, j'ajoute une précision :
"puisque si il n'y a pas d'interraction directe avec l'image affichée
(souris, clavier etc) il n'est pas necessaire d'utiliser TPaintBox"
Je vais dessiner des pions dans le timage puis je pourrais ensuite "deplacer" ces pions via des drag/drop, clic etc, imagine un jeu d'echec, je peux cliquer sur une pièce, là se déssine les cases d'arrivée possibles pour cette pièce, je clic sur la case d'arrivée de mon choix et la pièce se déplace (avec ou sans animations)
Je reste avec PaintBox ou Image ?
Merci encore
Commenter la réponse de JulioDelphi
Messages postés
4307
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
25
0
Merci
TPaintBox + Timer reglé a 45ms (20fps)

regarde ma source mastermind! ça te donnera un guide :

http://www.delphifr.com/codes/MASTERMIND-V1-MASTERMIND-ENGINE-V1_38767.aspx

Commenter la réponse de f0xi