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

C++Builder Discussion :

Raffraichissement Canvas TForm


Sujet :

C++Builder

  1. #1
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 342
    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 342
    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
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Il faudrait prendre un peu de recul de manière à bien cerner tout ce qui doit persister et tout ce qui évolue !

    Travailler avec un bitmap pour garder en mémoire ce qui doit être représenté et dans ce cas on peut raisonner en terme d'image de fond que l'on dessine en premier pour ensuite dessiner d'autres images ou effectuer d'autres opérations graphiques.
    Donc faire en sorte que tout puisse être redessiné dans la OnPaint (ce qui doit persister, ce qui se renouvelle ou ce qui se rajoute).
    On peut éventuellement s'en sortir assez facilement en développant des classes graphiques sachant se dessiner sur un canvas à partir de leurs propriétés (ce n'est peut-être pas utile ici ???).

    A plus !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 57
    Par défaut
    Bonjour,

    tu peux peut-être utiliser les composants Graphics32 avec lesquels on peut travailler sur des "layers" (Calques ?) comme avec Gimp ou Photoshop ou autre logiciel photo.

  4. #4
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 342
    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 342
    Par défaut
    Ouh là, j'ai pas bien compris vos réponses.

    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, le 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 !

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Tu n'as pas pensé dessiner à la fois sur la form et sur le bitmap ?
    Comme ça, lors de la OnPaint... !

    A plus

  6. #6
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 342
    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 342
    Par défaut
    Excuse-moi Henderson mais je ne vois pas trop où tu veux en venir...

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Il me semble pourtant, pour l'avoir fait, de dessiner sur le bitmap de fond et sur la form (via le canvas).

    Chez moi, avec mon BCB3 Pro, le fait de dessiner sur la form directement ne sollicite pas la OnPaint.

    Il est clair que si la OnPaint est sollicitée ultérieurement, il faut que le graphisme dessiné sur la form le soit aussi sur le bitmap de fond, sinon il disparait.

    Pour info, je le faisais pour des bitmaps très petits (20*12) et comme tu le dis si bien, il aurait été ridicule de redessiner l'ensemble.

    On y gagne en dessinant 2 fois un petit bitmap au lieu de tout rafraîchir !

    A plus !

  8. #8
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 342
    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 342
    Par défaut
    Ok, j'ai compris ce que tu voulais me dire.
    Le problème est ailleurs alors.
    Il faut que je cherche pourquoi le dessin du Bitmap dans le Canvas de la Form déclenche un 'OnPaint'.
    Si j'arrive à l'empêcher, le raffraichissement total n'aura pas lieu.

    Apparemment c'est pas gagné, car dès que je sors de ma procédure de dessin, Windows traite les messages, et envoie un VM_PAINT à mon application. D'où le passage dans 'OnPaint'.

    J'ai une idée, c'est de mettre une variable de verrou à l'entrée de la procédure 'OnPaint' pour en sortir immédiatement lorsqu'on ne veut pas qu'elle soit exécutée, mais je trouve cela inélégant. Cela fait bidouille. Il doit bien exister un système plus officiel ...

  9. #9
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Compte tenu de la différence très probable entre nos deux versions de BCB, je ne connais pas de solution. Vérifier quand même s'il n'y a pas quelque chose pouvant entraîner un Repaint de la form. Voir également si le double buffering (qui n'existe pas dans ma version BCB) à une incidence sur le problème.

    Je viens encore de vérifier sur mon BCB3 PRo et j'ai bien cette possibilité de dessiner un bitmap via Canvas->Draw(...) sans que la OnPaint soit sollicitée.
    Par contre, il est évident que sur un OnResize, le dessin du bitmap est perdu si je ne le dessine pas également sur le bitmap de fond !

    A plus !

  10. #10
    Membre Expert Avatar de rtg57
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2006
    Messages
    1 342
    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 342
    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, 12h09
  2. Réponses: 2
    Dernier message: 20/06/2012, 09h27
  3. Raffraichissement Canvas TForm
    Par rtg57 dans le forum Delphi
    Réponses: 10
    Dernier message: 26/04/2007, 17h30
  4. Timage et Canvas??
    Par vanack dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2007, 11h38
  5. Réponses: 2
    Dernier message: 17/05/2002, 20h37

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