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 corriger les effets de scintillement sur un TPainBox


Sujet :

Composants VCL Delphi

  1. #1
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 635
    Billets dans le blog
    1
    Par défaut Comment corriger les effets de scintillement sur un TPainBox
    Bonjour,

    Y a-t-il une solution pour corriger les effets de scintillement observés sur un composant TPainBox ?

    Nom : Video_2025_11_14-1_edit_0.gif
Affichages : 201
Taille : 903,3 Ko

    Merci
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  2. #2
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chambord
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 193
    Par défaut
    Réponse bête: DoubleBuffered ?

    Ou alors, ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    paintbox1.controlstyle := paintbox1.controlstyle + [csopaque];
    Ton prog, c’est du pro ou open source, car le sujet m’intéresse ?

  3. #3
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 635
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par der§en Voir le message
    Réponse bête: DoubleBuffered ?

    Ton prog, c’est du pro ou open source, car le sujet m’intéresse ?
    TPaintBox ne possède pas de propriété DoubleBuffered.

    Code open source - je mettrai la source en ligne sur le site dès la fin du développement.
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  4. #4
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 635
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par der§en Voir le message
    Ou alors, ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    paintbox1.controlstyle := paintbox1.controlstyle + [csopaque];

    Merci der§en,

    Ça fonctionne impeccablement.

    Nom : Video_2025_11_14-3_edit_0.gif
Affichages : 174
Taille : 494,6 Ko
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 151
    Par défaut
    Tient cela me rappelle un truc écrit pour le forum : https://www.developpez.net/forums/d1...i/#post8056103
    Un exercice classique !
    Pour un outil de dessin de plan, c'était aussi de control plutôt qu'une PaintBox c'était au final plus simple pour le scrolling dans une ScrollBox que gérer soit même le fenêtrage


    Regarde aussi si tu peux déterminer un clipRect pour limiter la zone dessinée
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chambord
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 193
    Par défaut
    @xeGregory: pour tes liens, tu devrais définir des zones d’ancrages pour les liaisons, par exemple au milieu de chaque côté de tes formes voir même au 4 coins

  7. #7
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 635
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par der§en Voir le message
    @xeGregory: pour tes liens, tu devrais définir des zones d’ancrages pour les liaisons, par exemple au milieu de chaque côté de tes formes voir même au 4 coins

    Merci der§en

    Actuellement, Les points d’ancrage sont placés au centre de chaque côté de l’objet. 

    Nom : Video_2025_11_15-1_edit_0.gif
Affichages : 152
Taille : 976,1 Ko

    Je vais effectivement définir des zones d’ancrage pour les liaisons. Je pensais placer un point au milieu de chaque côté des formes, et éventuellement ajouter aussi les quatre coins pour offrir plus de flexibilité dans le positionnement des liens.
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  8. #8
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 635
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Regarde aussi si tu peux déterminer un clipRect pour limiter la zone dessinée
    Je viens de mettre en place cette fonctionnalité. Cela permet d'éviter de placer des formes à l'extérieur de la zone.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    procedure TFlowChart.ConstrainRectToBounds(var R: TRect);
    var
      W, H: Integer;
    begin
      NormalizeRect(R);
      W := R.Right - R.Left;
      H := R.Bottom - R.Top;
     
      if W > (FBounds.Right - FBounds.Left) then
        W := FBounds.Right - FBounds.Left;
      if H > (FBounds.Bottom - FBounds.Top) then
        H := FBounds.Bottom - FBounds.Top;
     
      if R.Left < FBounds.Left then
        R.Left := FBounds.Left;
      if R.Top < FBounds.Top then
        R.Top := FBounds.Top;
     
      R.Right := R.Left + W;
      R.Bottom := R.Top + H;
     
      if R.Right > FBounds.Right then
      begin
        R.Right := FBounds.Right;
        R.Left := R.Right - W;
        if R.Left < FBounds.Left then
          R.Left := FBounds.Left;
      end;
      if R.Bottom > FBounds.Bottom then
      begin
        R.Bottom := FBounds.Bottom;
        R.Top := R.Bottom - H;
        if R.Top < FBounds.Top then
          R.Top := FBounds.Top;
      end;
     
      NormalizeRect(R);
    end;
    Nom : Video_2025_11_15-2_edit_0.gif
Affichages : 148
Taille : 972,8 Ko

    Merci ShaiLeTroll
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 151
    Par défaut
    Si tu dessines dans un Bitmap puis tu reportes dans le PaintBox c'est mieux le clipping ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  10. #10
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chambord
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 193
    Par défaut
    Il a quand même un petit soucis de rafraîchissement sur les objets pas concernés pas le déplacement, je trouve

    Tu dessines directement dans le PaintBox, ou bien tu passes par un bitmap de travail ?

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 988
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 988
    Par défaut
    Plutôt que tout recalculer à chaque déplacement, n'aurait-il pas mieux valu calculer le clipping une fois pour toute au mouse down et limiter le mouvement de la souris par ClipCursor ?

    Si le diagramme est sauvé et rechargé sur une machine avec une résolution inférieure, y a-t-il mise à l'échelle ? Sinon ce clipping est plus gênant qu'autre chose.

  12. #12
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chambord
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 193
    Par défaut
    A tester aussi ce genre d’approche:
    https://delphi-bar.blogspot.com/2012...lickering.html

  13. #13
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 635
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par der§en Voir le message
    Tu dessines directement dans le PaintBox, ou bien tu passes par un bitmap de travail ?
    Oui, je dessine directement dans la PaintBox.

    Citation Envoyé par ShaiLeTroll Voir le message
    Si tu dessines dans un Bitmap puis tu reportes dans le PaintBox c'est mieux le clipping ?
    J’ai testé l’option Bitmap : C’est toute la PaintBox qui scintille à chaque rafraîchissement. 

    À choisir, je préfère que ce soient uniquement les objets qui scintillent. 

    Citation Envoyé par Andnotor Voir le message
    Plutôt que tout recalculer à chaque déplacement, n'aurait-il pas mieux valu calculer le clipping une fois pour toute au mouse down et limiter le mouvement de la souris par ClipCursor ?
    En effet, je n’avais pas envisagé cette solution. ClipCursor s’avère plus efficace que de recalculer en permanence, je vais donc approfondir le sujet.

    Citation Envoyé par Andnotor Voir le message
    Si le diagramme est sauvé et rechargé sur une machine avec une résolution inférieure, y a-t-il mise à l'échelle ?
    Non je n'est pas de mise a l'échelle, pour le moment.

    Citation Envoyé par der§en Voir le message
    A tester aussi ce genre d’approche:
    https://delphi-bar.blogspot.com/2012...lickering.html
    Je vais regarder ça.

    Merci
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 988
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 988
    Par défaut
    Citation Envoyé par XeGregory Voir le message
    J’ai testé l’option Bitmap : C’est toute la PaintBox qui scintille à chaque rafraîchissement.
    Regarde du côté des fenêtres layered, pas de scintillement puisque plus de messages WM_PAINT\WM_ERASEBKGND.
    Un bitmap en mémoire et un flush par UpdateLayeredWindow.

    (pense aussi à Direct2D plutôt que GDI)

  15. #15
    Invité de passage
    Homme Profil pro
    ‫‬
    Inscrit en
    Août 2025
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : ‫‬

    Informations forums :
    Inscription : Août 2025
    Messages : 98
    Par défaut
    Je pense qu'il y a une confusion, TPaintBox est un TGraphicControl n'a pas de handle et qui dessine directement sur le canvas du parent donc l'astuce pointée par der§en ou le remarque sur WM_ERASEBKGND ne changent rien, la première chose à faire c'est mettre DoubleBuffred du parent à True, et changer la méthode de rafraîchissement entre Invalidate et Repaint.

    l'idéal c'est de remplacer Paintbox par un TCustumControl pour profiter des fonctionnalités de dessin windows et aussi pour pouvoir géré les srcollbas si le dessin dépasse la fenêtre. et avec un TWincontrol on peut faire des rafraîchissements doux avec invalidateRect, UpdateWindow

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 988
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 988
    Par défaut
    Sur le principe je suis d'accord avec toi mais on peut supposer que le code est plus ou moins comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm23.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      if ssLeft in Shift then
      begin
        ...
        Invalidate;    // ou PaintBox1.Invalidate;
      end;
    end;
    Invalidate (Repaint même combat) demande une repainture (du parent ici) qui sera d'office précédée d'un WM_ERASEBKGND.
    Soit on ignore ce message (Message.Result := 1), soit on ne demande pas de rafraichissement en appelant directement PaintBox1.OnPaint(PaintBox1). Il ne disparaitra peut-être pas complétement mais le flicker sera déjà grandement réduit.

    Mais un bitmap en mémoire serait mieux puisqu'il pourrait même être utilisé pour l'effacement par WM_ERASEBKGND (on a le DC), Paint ne se chargeant plus que de l'objet en mouvement.

    Sinon, une fenêtre layered...

  17. #17
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 635
    Billets dans le blog
    1
    Par défaut Problème résolu : Scintillement lors du déplacement des formes
    Citation Envoyé par Andnotor Voir le message
    Sur le principe je suis d'accord avec toi mais on peut supposer que le code est plus ou moins comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm23.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      if ssLeft in Shift then
      begin
        ...
        Invalidate;    // ou PaintBox1.Invalidate;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TFFlowChart.DrawPaintMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
      if Assigned(FlowChart) then
      begin
        DrawPaint.Cursor := FlowChart.CursorForPoint(Point(X, Y));
     
        if (ssLeft in Shift) or (ssRight in Shift) then
        begin
          FlowChart.MouseMove(Point(X, Y));
          DrawPaint.Invalidate;
        end;
      end;
    end;
    Solution simple et efficace : J'ai activer le double buffering sur le formulaire

    Nom : Video_2025_11_17-1_edit_0.gif
Affichages : 96
Taille : 634,7 Ko

    DoubleBuffered := True a réglé mon problème de scintillement lors du déplacement des objets dans un PaintBox.

    Nom : Video_2025_11_17-2_edit_0.gif
Affichages : 92
Taille : 1,16 Mo
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  18. #18
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    1 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chambord
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 193
    Par défaut
    Le doublebuffered, c’est un peu utiliser une masse pour enfoncer une punaise, et puis cela augmente ta consommation CPU…

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/03/2022, 23h07
  2. Comment annuler les effets d'une macro sur les feuilles?
    Par jolzeviking dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/06/2008, 15h29
  3. Comment gérer les problèmes de connexion sur un idFTP ?
    Par giloutho dans le forum Web & réseau
    Réponses: 2
    Dernier message: 05/12/2005, 19h42
  4. Réponses: 6
    Dernier message: 16/06/2005, 10h07

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