Rafraichissement TCanvas

Résolu
cedricbi Messages postés 185 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 21 mars 2011 - 1 juin 2005 à 18:18
cedricbi Messages postés 185 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 21 mars 2011 - 3 juin 2005 à 06:30
Dans un programme j'ai besoin de modifier le Canvas d'une ListBox point par point à l'intérieur de l'évènement OnDrawItem. Mais Delphi rafraichit la listbox à chaque point que je modifie donc on voit des clignotement de l'image que je veut afficher ! Comment faire pour demander de ne rafraichir la ListBox qu'a la fin de l'évènement OnDrawItem ?

Merci de me répondre !

6 réponses

cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
1 juin 2005 à 18:41
Salut,



La meilleure (?) solution consiste sans doute à créer un bitmap
temporaire, dessiner dessus et copier le résultat dans le bitmap de la
ListBox.



Exemple :



procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;

Rect: TRect; State: TOwnerDrawState);

var

Bmp : TBitmap;

Rct : TrecT;

begin

Bmp := TBitmap.Create;

Bmp.Width := Rect.Right - Rect.Left;

Bmp.Height := Rect.Bottom - Rect.Top;

with Bmp.Canvas do

begin

// ....

// Dessin dans le canvas du bitmap Bmp

// ....

end;


Rct: =Classes.Rect(0,0,Bmp.Width,Bmp.Height);
ListBox1.canvas.CopyRect(Rect,Bmp.Canvas,rct); // Copie dans le canvas du Listbox


Bmp.Free;

end;







Ken@vo
<hr size="2" width="100%">Code, Code, Codec !




http://www.pourflorenceethussein.org/

[%3C/body ]
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
1 juin 2005 à 21:27
Salut,



Pour info Kenavo,

Dans un TBitmap, Rect(0,0,Bmp.width,Bmp.Height) = Bmp.Canvas.ClipRect;

et dans ce cas précis donc, CopyRect(Rect,Bmp.Canvas,Rct) fait la même chose que Draw(Rect.Left,Rect.Top,Bmp)



Tu économises ainsi une variable TRect (enorme !).

<hr size="2" width="100%">Pour ton problème, je te conseille d'utiliser un TImageList contement toutes les images de tes Items.

Lorsque tu as besoin de changer une des images, tu modifie celle du TImageList et donc, ton évenement OnDrawItem devient:



procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
ImageList1.Draw(
ListBox1.
Canvas,Rect.Left,Rect.Top,Index);


end;




Ce qui augmente les performances et te
permet même un effet de transparence à l'aide de la méthde
DrawOverlay(). Je suppose que c'est ce que tu voulais ? (sinon pourquoi
dessiner pixel par pixel) ??.



Pour plus d'info au sujet du TImageList, poses en un sur ta fiche, selectionne-le et presse F1.



En espérant t'avoir aidé.

@ ++ Florent



Si tu ne te plantes pas ......
tu ne poussera jamais
0
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
1 juin 2005 à 22:53
L'utilisation de DoubleBuffered ne serait pas plus simple

En fait, ça revient au même dans une seule ligne de commande (DoubleBuffered := true dans le OnCreate de la form)

Si DoubleBuffered a la valeur True, le contrôle fenêtré se dessine dans
un bitmap mémoire qui est ensuite utilisé pour dessiner la fenêtre.
L'utilisation d'un double tampon réduit les "sautillements" quand le
contrôle se redessine mais consomme davantage de mémoire...



@+
Bonne Prog'
Nico

<hr>

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !




www.ni69.new.fr</italique>
0
cedricbi Messages postés 185 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 21 mars 2011
2 juin 2005 à 19:00
Merci d'avoir répondu à ma question !

ni69 : Je ne sais pas pourquoi mais t'as méthode ne marche pas dans mon cas !
Dommage ça aurait été beaucoup plus simple !

Merci à tous !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
2 juin 2005 à 20:29
Désolé, je me suis mal exprimé, je voulais dire ListBox1.DoubleBuffered := true



@+
Bonne Prog'
Nico

<hr>

N'oubliez pas de cliquer sur Réponse acceptée lorsque la réponse vous convient !




www.ni69.new.fr</italique>
0
cedricbi Messages postés 185 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 21 mars 2011
3 juin 2005 à 06:30
J'avais compris mais ca ne marche pas !
Je ne sais vraiment pas pourquoi ! Mais le principal c'est qu'une des méthodes marches !

Merci quand même !

Si tu à une idée pourquoi ça ne marche pas ! fais moi signe !
0
Rejoignez-nous