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 :

Calque et BitBlt


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut Calque et BitBlt
    Bonjour,

    Pour afficher des graphiques, j'utilise actuellement un système de DC en mémoire avec un bitmap

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CClientDC dc(this);
    m_dcMem = new CDC();
    m_dcMem->CreateCompatibleDC(&dc);
    m_bMap.CreateCompatibleBitmap(&dc, m_Rect.Width(), m_Rect.Height());
    Dans le OnEraseBkgnd je fais un clear de la zone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m_dcMem->SelectObject(&m_bMap);
    m_dcMem->PatBlt(m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height(), PATCOPY);
    Dans le paint je dessine dans le dc m_dcMem et ensuite je fait un BitBlt dans le dc écran.

    Je voudrais mettre en place un système de calque qui m'éviterait de tout redessiner à chaque fois : dans mon cas
    • calque des axes
    • calque des courbes
    • calque des curseurs.


    J'ai beau utilisé 3 DC en mémoire et 3 bitmaps, rien à faire. A chaque fois il repasse dans le OnEraseBkgnd et du coup je perds tout, et si je fais en sorte de ne passer qu'une seule fois ma zone est noire.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Salut pourquoi appeler OnEraseBkgnd ?
    J'ai fait un programme éditeur de niveau pour un jeu , il y a création de calques en mémoires je n'ai pas de problèmes pour rafraichir l'écran.
    Si tu veux rafraichir l'écran et tout effacer un simple Invalidate() ou InvalidateRect() ( qui sera plus rapide et évitera les scintillements ) est approprié

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut
    Si je ne me trompe pas le OnEraseBkgnd permet de faire un clear totale de la zone de dessin.

    Je vais quand même essayer de ne plus l'utiliser. Pour cela il va falloir que dans ma fonction de dessin des axes je dessine un rectangle blanc à la taille de la zone de dessin.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 147
    Par défaut
    Bon j'ai modifié ma fonction Paint1 pour quelle fasse un rectangle blanc sur toute la zone de dessin et du coup je n'utilise plus OnEraseBkgnd.

    Ramarque :
    Paint1 : dessin des axes
    Paint2 : dessin des points (courbe)

    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
    void CGraph::OnPaint() 
    {
    	CPaintDC dc(this); // device context for painting
     
    	m_dc1->SelectObject(&m_bMap1);
     
    	Paint1(m_dc1);
     
    	m_dc2->SelectObject(&m_bMap2);
    	Paint2(m_dc2);
     
    	::TransparentBlt(m_dc1->GetSafeHdc(), m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height(), 
    					 m_dc2->GetSafeHdc(), m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height(), RGB(0, 0, 0));
     
     
    	dc.BitBlt(m_Rect.left, m_Rect.top, m_Rect.Width(), m_Rect.Height(), m_dc1, 0,0,SRCCOPY);
    }
    Le problème est que je voudrais bien ne faire appel à Paint1 qu'une seule fois au début et ensuite ne que le TransparentBlt pour le dessin des points.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 469
    Par défaut
    Pensez aussi que votre méthode OnPaint est appelée quand une autre application placée au-dessus de votre fenêtre se déplace pour rendre visible votre fenêtre.
    Il est tout à fait normal d'afficher le fond et les axes dans ce cas.

    Il est possible, pour des problèmes performances, de gérer de manière "différentielle" les zones à réafficher mais c'est un travail fastidieux qu'il ne faut faire qu'en cas de problème et pas avant.

Discussions similaires

  1. deplacer scrollbar dans calque
    Par prodi_64 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 21/12/2004, 12h18
  2. [FLASH MX2004] Mettre un calque invisible ?
    Par Ticoche dans le forum Flash
    Réponses: 6
    Dernier message: 19/11/2004, 15h23
  3. [Flash MX] Probleme de calques
    Par yonat94 dans le forum Flash
    Réponses: 2
    Dernier message: 28/04/2004, 12h18
  4. Problème avec BitBlt
    Par Gunadorio dans le forum MFC
    Réponses: 4
    Dernier message: 22/07/2003, 18h52
  5. [Kylix] Aide sur BitBlt
    Par mic006 dans le forum EDI
    Réponses: 1
    Dernier message: 10/12/2002, 22h54

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