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 :

[D7] Flickering sur composant personalisé


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 522
    Par défaut [D7] Flickering sur composant personalisé
    Bonjour,
    j'ai créé un petit composant TrackBar, à partir de TCustomControl. Voici le source :

    Track1.zip

    Pour le moment, je l'utilise comme une simple unité par exemple comme ceci :

    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
    Uses Track1 ;
    Var
      Trk     : TMyTracker ;
    { ====================================================================== }
    procedure TF_Princ.FormCreate(Sender: TObject);
    begin
      Trk := TMyTracker.Create(Self);
      Trk.Parent := Self ;
      Trk.Left := 10 ;
      Trk.Top := 20 ;
      Trk.Largeur := 300 ;
      Trk.Maxi := 100 ;
      Trk.Mini := -100 ;
      Trk.PosLabel  := 1 ;  // 1 Label à droite  0 en dessous
      Trk.Epaisseur := 8 ;
      Trk.Place(50);
      Trk.Curseur := gdTrait ;  // gdSans, gdTriangle, ...
      Trk.ShowTicks := True ;
      Trk.setTicks(-50) ;
      Trk.setTicks(50) ;
      Trk.ShowValTicks := True ;
      ...
    Tout fonctionne bien, mais quand je bouge le curseur avec la souris, j'ai un assez gros scintillement.

    J'ai essayé Doublebuffered sur la form Principale sans succès.

    Y a t il un moyen d’atténuer ou mieux de supprimer ce scintillement ?

    je dessine dans un Bitmap temporaire avant d'afficher dans le TCustomControl avec BitBlt.

    A+
    Charly

  2. #2
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 522
    Par défaut
    bonjour,
    pour agrémenter mon post, voici une image de ma trackbar :

    Nom : Trackbar.jpg
Affichages : 108
Taille : 9,1 Ko

    A+
    Charly

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 939
    Par défaut
    Dans ton composant, intercepte WM_ERASEBKGND et retourne 1 pour empêcher l'effacement avant repeinture.

  4. #4
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 522
    Par défaut
    Merci AndnotOr
    je vais essayer
    A+
    Charly

  5. #5
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 522
    Par défaut
    Bonjour Andnotor,

    j'ai ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private
      ...
      procedure WMERASEBKGND(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
     
    Implementation
    ...
    procedure TMyTracker.WMERASEBKGND(var Message: TWMEraseBkgnd);
    begin
      Message.Result := 1;
    end;
    Mais j'ai toujours un scintillement.
    Est ce qu'il faut ajouter autre chose ?

    A+
    Charly

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    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 096
    Par défaut
    Et le dessin ne devrait-il pas être effectué dans une redéfinition de Paint() plutôt que depuis PaintWindow() surtout que inherited Paint; avec TCustomControl car sa méthode est vide et donc cela ne sert à rien !

    Paint est justement une simplification POO de PaintWindow.
    Comme tu contournes le PaintWindow hérité de TCustomControl, cela ne verrouille pas le Canvas durant sa modification, j'ignore sur une application mono-thread si cela peut avoir un impact mais autant bénéficier de cela, sinon inutile d'hériter du TCustomControl, autant le faire directement depuis un TWinControl et géré manuellement le messages.

    Ta méthode Clear() et ton BitBlt sont séparé par un long calcul, cela doit avoir le temps de clignoter, je dirais ce que c'est inutile d'effacer si tu remplace tout à la fin.

    Tu peux aussi optimiser ton dessin en utilisant ClipRect

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TMyTracker.Paint(); // override, supprime PaintSlider et PaintWindow
    var
      Bool: Boolean;
    ...
    begin
      inherited Paint;
      // Clear ; // contre productif avec le BitBlt final
      Bool:= ...
    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

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

Discussions similaires

  1. [C#]Problème sur composant perso (Bouton Transparent)
    Par SLE dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/10/2005, 00h12
  2. Dessin à la volée sur composant transparent
    Par orelero dans le forum 2D
    Réponses: 1
    Dernier message: 28/07/2005, 17h12
  3. [Delphi 6] dessiner sur composant QuickRep
    Par KrusK dans le forum Composants VCL
    Réponses: 2
    Dernier message: 18/06/2005, 00h48
  4. fuite de memoire dans une liste de pointeur sur composant
    Par Nicolos_A dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/12/2004, 08h46
  5. [VB.NET] Problème sur composant comboBox hérité
    Par SergeF dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/06/2004, 14h54

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