Effectivement. Une des raisons pour lesquelles je propose une combinaison TBitmap/TImage.
Version imprimable
DUCROS s'est déjà décarcassé à expliquer tout ça en long en large et en travers sur le forum. :mrgreen:
Donc, tu cherches sur le forum :
Mot-clé : TPaintBox
Auteur : Waskol
Rubrique du forum : Delphi
Si tu ne trouve rien, c'est vraiment parce que tu as mal cherché
Bon courage hombre. ;)
En résumé :
- Avec ton TPaintBox, il te faut un TBitmap. Tu le crées dans le OnCreate de ta fiche, tu lui donne les dimensions de la PaintBox, et tu le détruit dans le OnDestroy de la fiche.
- Pour mettre à jour ton dessin, tu écris une procédure pour ça dans laquelle
a) tu dessines dans le bitmap
b) tu appelle PaintBox1.Repaint;
- Dans le OnPaint du TPaintBox tu dessine le contenu du bitmap sur la paintbox
Ce qui donne le schéma suivant :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) PaintBox1: TPaintBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); private { Déclarations privées } TonBitmap:TBitmap; public { Déclarations publiques } Procedure MiseAJourDessin; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin TonBitmap:=TBitmap.Create; TonBitmap.Width:=PaintBox1.ClientWidth; TonBitmap.Height:=PaintBox1.ClientHeight; end; procedure TForm1.FormDestroy(Sender: TObject); begin TonBitmap.Free; end; procedure TForm1.MiseAJourDessin; begin //Dessin dans le canvas du bitmap TonBitmap.Canvas.Draw(); //Appel du OnPaint de la PaintBox PaintBox1.Repaint; end; procedure TForm1.PaintBox1Paint(Sender: TObject); begin PaintBox1.Canvas.Draw(0,0,TonBitmap); end; end.
Ca va l'faire ? :aie:
Yep !
Un seul homme vous manque et tout barre en sucette, :mouarf:
Bien vu, Waskol, :king:
--
jp
Ha, une précision tout de même, si lenteur il y a c'est parce que d'une manière ou d'une autre vous utilisez la propriété pixels du bitmap ou du canvas (boudiou que c'est lent !)
Pour coder les pixel il est vraiment préférable de passer par la propriété "scanline" des canvas. (il y a un tuto sur le site perso de nono40 : http://nono40.developpez.com ).Code:MonBitmap.Canvas.pixels[x,y]:=clYellow;
très honnêtement, le temps de traitement d'une image peut varier dans un rapport de 1/2 seconde, à quelque millièmes de secondes (j'vous l'jure !).
Après, pour les Draw, line, etc, ça va encore à peu près. D'accord, ce n'est pas DirectX, mais on peut faire des choses assez "véloces" (voir ma version du Serpent pour le défi))
salut
pour augmenter l'efficacité de ton dessin tu peut
passer par les api windows
telque les selectobject
,createcompatiblebitmap,DeleteObject,BitBlt et autre joyeuseté
@+ Phil
J'ai suivi tout ce que vous avez dit sur le post.
Il y a eu pas mal de solutions et de 'débats'.
Je vous remercie pour votre aide.
Pense a appliquer le tag :resolu: ;)
et n'hesite pas a revenir nous voir si tu as des questions plus precises sur la methode que tu auras choisi :)
Je reviens un peu tard sur ce message mais un détail n'a pas été donné dans cette intéressante discussion ;)
Il est généralement conseillé de verrouiller le canvas pendant la manipulation, cela peut aider concernant les performances :P
Code:
1
2
3
4
5
6 BMP.Canvas.Lock; try ... finally BMP.Canvas.Unlock; // pas BMP.Vancas.Unlock; :-Þ end;
Je note :)
Je ne connaissant pas ca ... et en effet ca peut servir.