IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Raffraichissement Canvas TForm


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut Raffraichissement Canvas TForm
    Bonjour,

    je voudrais accélérer le traitement graphique de mon application.
    Pour cela, je voudrais que lorsque je dessine un Bitmap sur le Canvas de la fiche principale, seule la partie concernée par le changement soit dessinée.
    Or la procédure OnPaint efface tout le canvas avec la couleur de fond avant d'afficher mon Bitmap.
    Ce qui fait qu'en finalité, seul le Bitmap est affiché.

    Existe-til une solution à ce problème ?

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    ... accélérer le traitement graphique ... je voudrais que lorsque je dessine un Bitmap sur le Canvas de la fiche principale, seule la partie concernée par le changement soit dessinée.
    Possibilité 1 : Au lieu de dessiner les changements sur la Canvas du BitMap puis de dessiner ensuite le BitMap sur le canvas de la fiche (via un un Draw ou un StretchDraw = BitMap en entier) je commencerais par dessiner les changements directement sur le canvas de la fiche sans passer par l'intermédiaire d'un BitMap.

    Possibilité 2 : Si "partie concernée par le changement" désigne le BitMap en entier, au lieu de dessiner ce BitMap sur le canvas de la fiche ont peut aussi le transférer directement dans un TImage posé sur la fiche (avec par exemple la combinaison de Image1.Stretch:=true; et Image1.Assign(BitMap); )
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    Pour être plus précis, j'avais fait une version dans laquelle j'avais un bitmap, appelons-le ImageFond qui 'mémorisait' le canvas représentant le fond de la TForm principale.
    Ensuite j'exécutais quelques dessins sur ce bitmap, puis dans la procédure OnPaint, j'affichais ImageFond intégralement dans le Canvas de la fiche.

    Côté optimisation...ça craint. Réafficher un bitmap de 1024 x 768 pixels pour une petite modification de 32 x 32 pixels, c'est pas top !

    Donc l'idée est d'afficher directement dans le Canvas de la fiche, un petit bitmap de 32 x 32 pixels. Le problème est que dans ce cas, OnPaint commence par remplir le Canvas par la couleur de fond (donc cela efface tout), puis affiche le motif de 32 x 32 pixels. Il doit bien y avoir un moyen de préserver dans le Canvas de la fiche, tout ce qui n'est pas touché par la modification !
    __________________

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    C'est effectivement nettement plus rapide d'afficher un BitMap de 32x32 qu'un autre de 1024 x 768. Mais puisque l'affichage du BitMap-modifications déclenche via le onPaint le remplissage du Canvas de la fiche par la couleur de fond en effaçant tout moi j'essayerais de dessiner les modifications directement sur le canvas de la Form (sans passer par un bmp) en utilisant des Form1.canvas.LineTo() et autres routines de dessin placées directement dans le OnPaint.

    Par hasard il ne traînerait pas le code une instruction du type canvas.Fillrect()ou autre chose qui causerait le remplissage de tout le Canvas par la couleur de fond ? Car il n'est pas normal qu'il se modifie des trucs qui n'ont pas été modifés ... car les pixels de ce qu'on dessine dans une fenêtre sont placés à l'écran et Windows ne mémorise que la partie d'écran détruite par un recouvrement ou un redimensionnement ou actions similaires ... et dès que cette partie est à nouveau visible Windows apelle OnPaint pour lui demander de rafraîchir la partie redevenue visible et rien d'autre.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    Merci de t'attacher à mon problème,

    alors pour être encore plus précis, il s'agit de l'affichage d'images d'environ 150x100 pixels.
    Il n'est pas possible de les créer à partir des fonctions LineTo() et compagnie.
    J'envois donc directement ces bitmaps contenant les images, sur le canvas de la Form. Et là, j'enrage parce que pour un bitmap envoyer sur le canvas, OnPaint initialise tout le canvas de la Form.

    Doit bien y avoir une astuce ...

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    C'est effectivement anormal qu'OnPaint ré-initialise tout le canvas de la Form alors qu'il lui est demandé uniquement de raffraîchir une lucarne de 150x100 pixels.

    Je me demande s'il faut chercher du côté des astuces car je me demande s'il n'y a pas dans le code une subtilité qui cause le problème. Fais voir le bout de code de ce onPaint par la même occase je le testerai sur une installation différente de la tienne.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 343
    Par défaut
    Mille excuses,

    Vous aviez raison. Il y avait dans ma procédure de dessin, du code qui provoquait l'exécution de 'OnPaint'.

    En inhibant cette partie du code, maintenant lorsque je dessine sur le Canvas de la fiche, cela ne provoque pas l'appel à 'OnPaint'. Il n'y a donc pas de mystère.
    Merci à tous pour votre collaboration.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passer un text sur le Canvas d'une TForm dynamique
    Par Ardely dans le forum Langage
    Réponses: 4
    Dernier message: 05/03/2013, 13h09
  2. Réponses: 2
    Dernier message: 20/06/2012, 10h27
  3. Raffraichissement Canvas TForm
    Par rtg57 dans le forum C++Builder
    Réponses: 9
    Dernier message: 26/04/2007, 18h31
  4. Timage et Canvas??
    Par vanack dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2007, 12h38
  5. Réponses: 2
    Dernier message: 17/05/2002, 21h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo