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 :

Rafraichir le fond d'une Form


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Par défaut Rafraichir le fond d'une Form
    Bonjour,

    Voici mon problème: J'ai crée une application dont l'interface est partitionnée en différente partie. Il s'agit de Form ( qu'on appellera Form Fille) contenu dans une grande et même Form ( qu'on appellera form Mere). Mon problème est que lorsque je passe une fenêtre ( par exemple explorateur windows) au dessus de mon application mon interface est mal rafraichi et on observe de grosse trainée de la couleur de ma Form mere.
    J'ai tenté d'utilisé des Refresh(), des Repaint(), et des Update() à l’intérieur des Form fille mais ces trainée de couleur perdure toujours,

    De plus je ne veut pas utilisé trop la fonction Refresh() , car celle ci fait "scintillé" les éléments contenue dans les Forms.

    Voici exactement ce qu'on peut observer :

    http://www.hostingpics.net/viewer.ph...43263demo1.jpg

    ( je n'est pas réussi a glisser l'image dans le message)

  2. #2
    Membre expérimenté
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2012
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2012
    Messages : 164
    Par défaut
    Bonjour,

    essaye de mettre la propriété de DoubleBuffered à true.

    selon l'aide:

    Si DoubleBuffered a la valeur false, le contrôle fenêtré se dessine directement dans la fenêtre. Si DoubleBuffered a la valeur true, le contrôle fenêtré se dessine dans un bitmap mémoire qui est ensuite utilisé pour dessiner la fenêtre. L'utilisation d'un double tampon réduit les "sautillements" quand le contrôle se redessine mais consomme davantage de mémoire.

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 109
    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 109
    Par défaut
    C'est en général, un effet que l'on voit lorsqu'un programme ne répond pas !
    As-tu redéfini la WndProc pour l'image de Fond ?
    Ton GroupBox utilise des Anchors Left+Top+Right ?
    As-tu des composants qui se supperposent comme des Label ou StaticText ayant cette couleur
    Voir aussi ParentBackGround

    Sinon, comme le suggère Guyt54, le DoubleBuffered peut éviter ce problème
    Essaye aussi Invalidate
    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

  4. #4
    Membre éclairé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Par défaut
    Je vies de faire le test avec le DoubleBuffered il fonctionne pour certains éléments, mais cette solution ne fonctionne pas pour les labels et les SpeedButtons.


    Pour répondre à ShaiLeTroll

    Avec quoi redéfinit-on le WndProc?
    Mon groupBox utilise bien des anchors en Top, left et right

    Mes labels ont un fond transparent.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 109
    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 109
    Par défaut
    Citation Envoyé par flamme34 Voir le message
    Avec quoi redéfinit-on le WndProc?
    Oubli, c'était juste pour savoir, on peut facilement faire des erreurs avec la WndProc
    Tu as donc juste changer la couleur de Fond

    Citation Envoyé par flamme34 Voir le message
    Mes labels ont un fond transparent.
    On dirait que tu as un composant sous le GroupBox Energie qui a tenté de dessiner alors qu'il n'aurait pas du !

    Je n'ai jamais vu ce phénomène sur XP, sur Vista on peut voir un défaut d'affichage des Labels avec D7 (il y a un patch à ce sujet)

    As-tu tente Invalidate dans un OnActivate celui de TApplicationEvents ou de la TForm
    Les deux ne fonctionnent pas forcément de la même façon
    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 éclairé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Par défaut
    Je viens de tester le Invalidate dans le OnActivate de ma TForm

    Mais sans plus de resultat. Je me suis aperçu que le Refresh() ne supprimais pas forcement les trainée de couleur.

  7. #7
    Membre émérite
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 941
    Par défaut
    Est ce que tu utilises OnPaint() dans ces TForms ?

  8. #8
    Membre éclairé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Par défaut
    Je reviens sur ce message car mon problème n'est toujours pas résolu. est-il possible que ce problème puisse provenir du fait d'un rafraichissement trop fréquent ( toute les 10milliseconde par exemple).

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 109
    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 109
    Par défaut
    toute les 10milliseconde = 100 fois par second ~ 100Hertz !

    Consulte la notion de VSync et de rafraichissement vertical !
    Pense que tu génère plus d'image que l'écran est capable d'en afficher !

    Sinon les SpeedButton en transparence comme les TLabels sont dessinés par Delphi et non par Windows, disons que selon le thème, il y a quelques défauts d'affichage
    Le SpeedButton en Flat+Transparent perd sa transparence au survol, je trouve cela dommage surtout sur un noir (genre player de DVD), sur ton fond bleuté, ça ne doit pas choquer

    J'ai vu des TLabel qui clignotait parce que le Caption était modifié trop souvent (voire on fini par ne plus le voir tellement ça change trop vite)

    tu es obligé de rafraichir autant ?
    Perso, si j'ai refresh auto, je le met à la demi-seconde, c'est bien suffisant pour donner une illusion de temps-réel, surtout que le cerveau humain, faut lui laisser le temps de digérer l'info !

    Un Timer calé sur 500 va lire des objets (avec critical section), un thread lui va bosser en fond et remplir les données

    A la place du Timer, il y a aussi OnIdle, en gros quand ton programme n'a rien à faire, cela arrive assez souvent, tu lit les données à afficher (si elles ont changées)

    As-tu mis ton monitoring dans un thread ?
    Oui, tu peux appliquer mon idée, évite le Synchronize pour de l'affichage, préfère un système d'échange par un objet protégé pour par une FIFO TThreadList
    NON ? Oh ! tu devrais !
    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 éclairé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Par défaut
    tout d'abord merci d'avoir pris le temps de répondre à ce message.

    tu es obligé de rafraichir autant ?
    je ne suis pas obligé de rafraichir autant, mais le plus possible est préférable, car le timer qui rafraichi mes labels lance également une vérification de l’état de certain capteur, afin de pouvoir couper mon laser au cas où un élément de sécurité aurai été déclenché
    (un laser dans les yeux même en moins d'une seconde ça peut faire très très mal)

    Pour le reste je vais explorer tes idées. je te tiens au courant dès que j'ai eu le temps de faire tout ça ^^

    merci encore

  11. #11
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,
    Citation Envoyé par flamme34 Voir le message
    je ne suis pas obligé de rafraichir autant, mais le plus possible est préférable, car le timer qui rafraichi mes labels lance également une vérification de l’état de certain capteur, afin de pouvoir couper mon laser au cas où un élément de sécurité aurai été déclenché
    D'où l'idée que tu devrais séparer au maximum la partie vérif des capteurs et coupure du laser d'une part, et le rafraîchissement de l'écran d'autre part, en collant toute la partie capteur/laser dans un autre thread.
    Reste à voir ensuite comment faire la synchro entre ce thread et ton affichage, mais ShaiLeTroll te donne quelques bonnes pistes.

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/08/2013, 20h52
  2. [Lazarus] Image de fond dans une form
    Par camcam10 dans le forum Lazarus
    Réponses: 1
    Dernier message: 30/05/2011, 09h13
  3. [PPT-2002] macro pour colorier le fond d'une forme
    Par bubus31 dans le forum VBA PowerPoint
    Réponses: 4
    Dernier message: 20/10/2009, 21h22
  4. Rafraichir l'affichage d'une form/progressbar
    Par bubulemaster dans le forum Windows Forms
    Réponses: 7
    Dernier message: 19/03/2008, 16h02
  5. [VB6] Rendre transparent le Fond d'une FORM
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 17/05/2006, 08h23

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