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

MFC Discussion :

Faire dessiner un contrôle par son container


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Par défaut Faire dessiner un contrôle par son container
    Bonjour!

    J'ai des centaines de petits contrôles que j'aimerais dessiner à travers un memDC, au moment où je dessine leur container.

    Pour cela, je crée le memDC dans le container et j'appelle le OnDraw de chaque contrôle.

    Cependant, le OnPaint de mes contrôles est toujours actifs! J'ai essayé de ne pas trapper l'événement, mais c'est le OnPaint de CWnd qui doit être appelé. J'ai aussi essayé de faire une fonction vide, mais à ce moment là je perds mes timers. J'ai ensuite essayé de mettre SetRedraw(false), mais ça bloque la fenêtre et je n'ai plus les événements qui y sont liés.

    Si je crée un CPaintDC, ou si j'appelle BeginPaint et EndPaint dans le OnPaint, ça fonctionne, mais c'est au moins 3 fois plus lent (et déjà qu'en optimisant, ça prend tout près de 5 secondes par affichage...)

    Est-ce qu'il y a un moyen plus rapide de faire cela? Peut-être je ne suis même pas dans la bonne direction, je n'ai pas trop l'habitude...

    Merci de m'éclairer un brin sur la chose!

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu peux essayer d'utiliser ValidateRect() sur tes contrôles pour empêcher qu'ils se redessinent
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Par défaut
    Je cherchais en effet un truc comme ça (pourquoi ils n'ont pas appelé ça SetUpdateRect ?? ou ils auraient au moins pu mettre un lien de GetUpdateRect à ValidateRect... en tout cas, c'est pas ici qu'on va régler ça )

    Malheureusement, j'obtiens le même résultat qu'avec SetRedraw(false).

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Par défaut
    Finalement, après plus ample observation, ça fonctionne...
    Il faut être patient par contre, car le OnMouseMove est "dégelé" après tout près de 10 secondes...

    D'autres idées qui pourraient faire avancer le problème un peu plus près de la solution?

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    il vaudrait mieux que ce soit le controle qui gere son affichage en memoire pour un repaint plus rapide.
    si c'est ça le sujet bien sur...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2005
    Messages : 20
    Par défaut
    Le fait est qu'il y a énormément de contrôles et que, lorsqu'on les laisse se dessiner par eux même, ils apparaissent un à la fois, c'est long et c'est visuellement un peu étrange.

    D'où l'idée d'utiliser le container (qui est en soi un autre contrôle) comme "super contrôle" et de concentrer tout le boulot dedans. Le memDC sert à accélérer l'affichage, puisqu'on n'a pas besoin d'afficher réellement chaque contrôle un à un.

    En fait, ce sont les contrôles qui se dessinent eux-même, mais pas par le OnPaint, mais plutôt par le OnDraw (pour utiliser le même DC que le contrôle parent)

    Il doit bien y avoir un moyen pour faire ça efficacement, non?

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

Discussions similaires

  1. [Lazarus] Faire passer un contrôle par une procédure
    Par Ardely dans le forum Lazarus
    Réponses: 2
    Dernier message: 17/06/2011, 16h10
  2. remplir la scene par son container principal
    Par wadison dans le forum JavaFX
    Réponses: 6
    Dernier message: 23/08/2010, 17h52
  3. [C#] Comment accéder à un contrôle par son nom ?
    Par km3l3on dans le forum Windows Forms
    Réponses: 4
    Dernier message: 01/06/2010, 19h34
  4. Réponses: 4
    Dernier message: 16/10/2006, 14h12

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