JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 2010
-
6 mai 2009 à 20:47
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 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 ?
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.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 7 mai 2009 à 00:03
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.
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 7 mai 2009 à 07:39
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 ?
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 7 mai 2009 à 13:17
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 7 mai 2009 à 13:50
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