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

Composants VCL Delphi Discussion :

Comment dessiner sur un Bitmap sans scintillement ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut Comment dessiner sur un Bitmap sans scintillement ?
    Bonjour a tous !

    J'ai un gros probléme, voila sur un bitmap je dessine des traits et l'image entiere scintille, comme si le bitmap était rafraichi en permanence, alors si quelque pourrait me dire comment on fait pour dessiner un trait sans que le bitmap scintille cela serait super sympa.
    Merci !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Je présume que vous utiliser un TImage pour afficher l'image.

    Dans tous les cas, le principe est le même.

    Pour comencer pourquoi le sintillement.

    1° J'ai une image dans le Picture.Bitmap d'un TImage.

    2° je comence à travailler dessus en le netoyant freebitmap avant de le reécrire.
    Conséquence windows "repaint" la nouvelle image (image intermédiaire).
    3° je trace la 1° partie de mon image
    Conséquence windows "repaint" la nouvelle image(image intermédiaire).
    4° je trace la 2° partie de mon image
    Conséquence windows "repaint" la nouvelle image(image intermédiaire).

    N° je trace la derniére° partie de mon image
    Conséquence windows "repaint" la nouvelle image(image finalee).

    windows à donc redessiné x fois mon image pendant mon travail de dessin. En faite il à même fait un certain nombre d'erase background (Effacement du fond d'écran de l'image avant de la redessiné), chaque erase background étant réafiché.

    La sucession des tout les affichages sucessif font sintiller l'image.

    Solution.


    clignotement du à la manière de redessiner l'image
    1° Dessiner l'image dans un canvas intermédaire.
    2° copier EN UNE SEULE FOIS L'image intermediaire dans l'image finale.
    Cela permet d'éliminer les clignotements du à un réaffichage lorsque vous fabriquer votre image.

    Dans ce cas lorsque vous metter une nouvelle image il se passe la chose suivante.

    1° vous dessiner la nouvelle image dans un bitmap intermediaire.
    2° Vous mettez le bitmap dans l'image du TImage.
    3° Windows Fait un erase Backround et reaffiche le timage comme vide.
    4° windows renseigne le canvas du bitmap du TImage (avec votre nouvelle image) et reafiche la nouvelle image.

    Il reste donc un clignotement.

    Clignotement dus au erase background

    Lorsque vous créer votre ficher, indiquer "doubleBuffered := True;"


    1° vous dessiner la nouvelle image dans un bitmap intermediaire.
    2° Vous mettez le bitmap dans l'image du TImage.
    3° Windows Fait un erase Backround dans un buffer intermédaire.
    4° windows renseigne le buffer intermediaire avec votre nouvelle image.
    5° Windows applique le buffer au canvas du timage, puis réaffiche l'image.

    Il ne reste plus qu'un seule réaffichage donc plus de clignotement.

    Les fenêtre MDI Child/ Cas particulier
    En générale, les fenêtre mdi child présente des mauvaises suprisse dans ce genre de cas car "DoubleBuffered" ne fonctionne pas correctement avec elle.

    Dans ce cas j'utilise LockWindowUpdate. Cette ordre bloqe totalement le redessin d'une fenêtre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    LockWindowUpdate(Self.Handle); // Self est la form à bloquer
    try
      // Ici toutes mes action de modification d'une ou plusieurs image, voir de modification de composants.
    fianlly
      LockWindowUpdate(0); // Deploque l'afichage de la fenêtre
      // Nota: Windows ne peut bloquer qu'une seule fenêtre à la fois.
     //           Toutes le modification d'affcihage seront effectué lors du debloquage de la fenêtre. Cela permet de SIMULER une mise à jour de plusieur composants SIMULTANEMENT.
    End;

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Merci c'est sympa du renseignement, sur ce bonne année a toi !

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2002
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 49
    Points : 50
    Points
    50
    Par défaut
    essai cette fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    votreAfficheur.doubleBuffers



    l'idée creation d'un double buffers

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

Discussions similaires

  1. Dessiner sur un composant sans Canvas
    Par josse95 dans le forum C++Builder
    Réponses: 10
    Dernier message: 31/03/2007, 19h01
  2. Dessiner sur un composant sans Canvas
    Par bandit boy dans le forum C++Builder
    Réponses: 6
    Dernier message: 08/02/2007, 13h12
  3. Réponses: 23
    Dernier message: 29/07/2006, 19h09
  4. comment dessiner sur une image
    Par baracouda dans le forum Graphisme
    Réponses: 2
    Dernier message: 26/05/2006, 00h21
  5. [Transparent] - Comment dessiner sur 2 TImage ?
    Par TOTO32 dans le forum Langage
    Réponses: 15
    Dernier message: 08/08/2004, 01h06

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