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 :

Pb affichage avec un PaintBox (pour eviter scintillement)


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 15
    Points : 13
    Points
    13
    Par défaut Pb affichage avec un PaintBox (pour eviter scintillement)
    bonjour, mon appli utilise de gros fichier bmp... contenu ds des TImages
    A chaque fois que je touche au canvas, un gros scintillement apparait sur l'image pour le rafraichissement.

    G donc trouvé conseil sur le net pour eviter ce scintillement et l'on m'a parlé de "TPaintBox"

    En fait au oieu de faire mes modifs sur mon image, je la fait sur mon PaintBox.

    g implementé l'evt onPaint de "PB", mon paintbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void __fastcall TFormSolsView::PBPaint(TObject *Sender)
    {   TImage * image;
         image = FrameImage->ImagePlanTemp;
     
         image->Canvas->CopyMode = cmPatCopy;
         image->Canvas->CopyRect(image->ClientRect,PB->Canvas,PB->ClientRect);
     
    }
    MAis g plusieurs pb :

    - le PB apparait au dessus de l'image des que j ecrit dedans meme si il est en invisible !!
    - l'evt OnPaint ne se declenche pas qd je dessine sur le canvas du PB !!!!!
    - je ne sais pas koi mettre ds le copy mode car l'image sur laquelle j'ecrit est en mode transparent puisque g plusieurs image superposées.

  2. #2
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    dans le on mouse move du paint box, au lieu de dessiner sur le paintbox, il faut que tu dessines dans l'image et que juste derrière sur fasse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    image->Canvas->CopyMode = cmPatCopy; 
    image->Canvas->CopyRect(image->ClientRect,PB->Canvas,PB->ClientRect);
    n'appelle pas Paintbox->refresh() sinon ca va scintiller.

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Ta reponse me fais douter !

    on peux bien se servir d'un paint box pour eviter le scintillement ?
    cad au lieu d'ecrire directement ds le canvas d'une image, ecrire ds celui d'une paint box cachée et ensuite balancer le tout ds celui de l'image ???

    est ce possible ca ??
    car je l'ai lu sur internet mais je n'arrive pas a le mettre en oeuvre

    de plus qd tu dis :
    dans le on mouse move du paint box, au lieu de dessiner sur le paintbox, il faut que tu dessines dans l'image et que juste derrière sur fasse :
    ca me va pas car j'aimerai que le PaintBox soit caché et donc le mouse move ne se declenche jamais.

    Moi j'avioas pour idee de mettre la copy ds le OnPaint mais enf ait il ne se declenche pas sur un changement ds le canvas !!
    je ne sais pas koi faire !

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    j'abandonne tant pis ca sintillera !

  5. #5
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    au lieu de dessiner dans un paintbodx caché, il faut que tu dessine sur le canvas d'un TBitmap alloué dynamiquement, et à chaque fois que tu dessines, juste après du appeles PaintBox->Canvas->Draw(0, 0, bitmap);

    mais n'appelles surtout pas la méthode repaint() ou la méthode refresh()

    Ca ca marche.

  6. #6
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Je fais remonter ce sujet car je ne parviens pas à réaliser ce que vous expliquez...

    Par exemple, si je veux déplacer une image de gauche à droite, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TBitmap *bmp = new TBitmap("logo.bmp");
    for(int i=0;i<200;i=i+5)
    {
            Form1->Canvas->Draw(i,0, bmp);
            Sleep(10);
    }
    delete bmp;
    La c'est clair, mon image ne scintille vraiment pas, par contre, elle trace une grande trainée persistante en dessous d'elle...

    Comment faire pour éviter cela ? J'ai essayé avec un Form1->PaintBox1->Canvas, ça fait pareil; j'ai tenté de faire redessiner un rectangle gris à chaque fois, ça se met à scintiller.

    En fait, quelle solution adopter pour avoir plusieurs calques d'images avec transparence, animés, qui ne scintillent pas ? (un peu comme des sprites de jeux vidéo, sauf que ce n'est pas l'application ici)

  7. #7
    JEG
    JEG est déconnecté
    Membre éclairé
    Avatar de JEG
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 211
    Points : 727
    Points
    727
    Par défaut
    le code que tu donnes est bon mais c'est normal que ca fasse un trainée... car il faut quand meme effacer la région i-1 (en faisant un draw d'un bitmap entièrement gris) avant de dessiner l'image par dessus.

    Tu peux regarder l'exemple "sprite" de la jAPI pour regarder comment j'ai fait

    le mieux serait de faire un bitmap de la taille du canvas, tout dessiner dans l'image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bitmap->Canvas->Draw(i, 0, bmp);
    , et au tout dernier moment de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1->Canvas->Draw(0,0, bimap);

  8. #8
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Merci !

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

Discussions similaires

  1. Affichage page par page des résultats avec des pointillés pour les numeros de page
    Par lewhechris dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 27/10/2011, 12h15
  2. Problème pour affichage avec Eval()
    Par arngrimur dans le forum ASP.NET
    Réponses: 2
    Dernier message: 26/10/2011, 12h13
  3. Réponses: 0
    Dernier message: 18/03/2011, 16h10
  4. Réponses: 2
    Dernier message: 19/03/2008, 11h58
  5. Réponses: 1
    Dernier message: 23/11/2007, 10h03

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