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 :

Mon objet issu de TGraphicControl est redessiné lorsqu'une fenetre se deplace au dessus


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut Mon objet issu de TGraphicControl est redessiné lorsqu'une fenetre se deplace au dessus
    Bonjour,

    J'ai développé un objet graphique dérivé de TGraphicControl et sur certains PC uniquement, lorsqu'on déplace une fenêtre dessus, l'objet est redessiné totalement, ce qui pose un problème de performance.
    Je pense que c'est lié au driver de la carte graphique car j'ai un PC avec double boot: sous XP j'ai le problème et sous win 7 32 bits, je n'ai pas le problème mais j'ai rencontré le problème aussi sur un autre PC qui est sous Win7.

    J'ai pas mal cherché, je trouve des choses sur TCustomControl (Méthode CreateParams) mais pas TGraphicControl.
    Comment éviter cela ?

    merci
    Franck

  2. #2
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonjour.

    Si tu prends un TPaintBox (simple dérivé de TGraphicControl) et que tu places un compteur de passage dans son événement OnPaint, tu le verras s'incrémenter au passage d'une autre fenêtre.
    C'est Windows qui gère l'opportunité du re-dessin, lorsque par exemple un composant masqué devient visible en tout ou partie.
    La qualité de la carte graphique a évidemment son importance.

    Ce que tu peux faire pour augmenter les performances avec un TGraphicControl :
    - ne pas faire d'effacement du fond (ex : un fillrect), ce n'est plus nécessaire (à partir de XP je crois).
    - dans ton événement OnPaint : créer un Tbitmap, tout dessiner sur ce bitmap, puis afficher ce bitmap. Comme il n'y pas de changement au dessin, tu ne devrais avoir aucun scintillement. C'est le principe adopté par la double-bufférisation.

    Cordialement
    Thierry

  3. #3
    Membre expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut
    Merci Thierry,

    Ce que je ne comprends pas:
    j'ai le cas d'un PC DELL sur lequel j'ai 3 OS en multiboot:
    - Avec l'OS WIN7 en 32 bits : Pas de problème
    - Avec l'OS WIN7 en 64 bits: Pas de problème
    - Avec l'OS WIN XP en 32 bits: j'ai le problème.

    Donc pour ce PC ce n'est pas un problème matériel mais bien logiciel qui est lié à l'OS ou au driver de la carte graphique mais j'ai aussi le problème sur un autre PC qui est sous WIN7 en 32 bits.

    J'ai mis à jour tous les drivers (carte mère/chipset, Carte graphique) avec les dernières versions: Idem.

    J'ai compilé mon soft sans manifest et avec manifest: idem

    voici le manifest:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?xml version="1.0" encoding="utf-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
      <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="MyAppli" type="win32"/>
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
          <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
          </requestedPrivileges>
        </security>
      </trustInfo>
    </assembly>
    cela me pose un vrai problème..

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Le principe est différent entre XP et Vista+.

    Jusqu'à XP, les applications accédaient directement à la mémoire d'affichage et si deux fenêtres se chevauchaient (donc accédaient partiellement à une même zone mémoire), les deux devaient se redessiner.
    Depuis Vista et le Desktop Window Manager (DWM), une copie de la fenêtre est conservée en mémoire et l'OS travaille sur cette copie pour le rendu final à l'écran. Il n'y a plus cette notion de chevauchement et la fenêtre ne reçoit par conséquent plus autant d'ordre de rafraîchissement (WM_PAINT).

    Si le problème survient également sur un 7, c'est que DWM y est désactivé

    Le principe est expliqué ici.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    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 093
    Par défaut
    Intéressant !
    Sous W7 SR1 Win64 et une application XE2 Win32 et le process dwm.exe "Gestionnaire de fenêtres du Bureau"
    Dans les propriétés systèmes je suis sur "Laisser Windows choisir la meilleure configuration"
    Est-ce que cela que l'on voit dans "Paramètres personnalisés" correspond à la conf en cours, "Activer la composition du Bureau" est coché ?

    pfEnabled renvoyé par Winapi.Dwmapi.DwmIsCompositionEnabled est à FALSE

    J'ai effectivement le fameux effet de fenêtre rémanente
    justement dans un programme de test avec une boucle sans ProcessMessages qui rempli la DB pour simulation,
    le temps que cela tourne je m'amusais à dessiner, lorsque le dessin revenait c'était le signe "c'est fini"

    Depuis, j'ai ajouté des ProgressBar vu que je lance dans la journée (ainsi que mes collègues qui auraient besoin de données de test)
    L'effet est moins notable mais toujours présent !
    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 expérimenté Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Par défaut
    Bravo Andnotor, c'est bien ça !!!

    La version de Win7 qui posait problème n'avait pas le mode aero d'activé, maintenant ça marche.
    Concernant XP, comme ce système tombe bientôt en désuétude, ce n'est pas trop grave, je l'indiquerai dans la rubrique de compatibilité.

    merci
    Franck

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Citation Envoyé par franckcl Voir le message
    Concernant XP, comme ce système tombe bientôt en désuétude, ce n'est pas trop grave, je l'indiquerai dans la rubrique de compatibilité.
    Oui mais DWM n'est pas forcément actif sur 7 comme tu l'as constaté et pas du tout sur 2008. De plus DWM peut être désactivé par GPO.
    Perso, je gérerais cela correctement.

    Citation Envoyé par ShaiLeTroll Voir le message
    Est-ce que cela que l'on voit dans "Paramètres personnalisés" correspond à la conf en cours, "Activer la composition du Bureau" est coché ?

    pfEnabled renvoyé par Winapi.Dwmapi.DwmIsCompositionEnabled est à FALSE
    Je suppose que c'est cela, je n'ai jamais vraiment joué avec ces réglages

    Citation Envoyé par ShaiLeTroll Voir le message
    J'ai effectivement le fameux effet de fenêtre rémanente
    justement dans un programme de test avec une boucle sans ProcessMessages qui rempli la DB pour simulation,
    le temps que cela tourne je m'amusais à dessiner, lorsque le dessin revenait c'était le signe "c'est fini"

    Depuis, j'ai ajouté des ProgressBar vu que je lance dans la journée (ainsi que mes collègues qui auraient besoin de données de test)
    L'effet est moins notable mais toujours présent !
    Il faudrait voir aussi dans quelle mesure la compatibilité Windows 7 éventuellement définie dans le manifest peut jouer un rôle.
    Sinon passer par une fenêtre layered (suffisante s'il n'y a pas de saisie). Plus de WM_PAINT, plus de soucis

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/06/2011, 12h00
  2. Comment afficher une fenetre d'info par dessus mon index.php
    Par bigdule dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 06/05/2009, 23h36
  3. Réponses: 4
    Dernier message: 28/09/2006, 14h50
  4. Redessiner (rafraichir) une fenetre
    Par @drien dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 17/01/2006, 21h59
  5. [C#]Quand mon objet axWebBrowser est-il supprimé ?
    Par Kcirtap dans le forum Windows Forms
    Réponses: 5
    Dernier message: 18/10/2005, 10h16

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