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

Visual C++ Discussion :

Affichage permanent dans la View


Sujet :

Visual C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut Affichage permanent dans la View
    Bonsoir à tous !

    Dans le cadre d'un projet concernant un jeu de billard, je dois afficher celle-ci ainsi que toutes les billes sur la fenêtre principale.

    Je souhaiterai savoir s'il est possible d'afficher la table une fois pour toute à l'écran, sans l'inscrire dans la fonction OnDraw() pour pas qu'elle soit rafraichit lorsque les billes bougent et qu'il y ait un effet scintillement absolument affreux ... merci d'avance !

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Staticx83 Voir le message
    Bonsoir à tous !

    Dans le cadre d'un projet concernant un jeu de billard, je dois afficher celle-ci ainsi que toutes les billes sur la fenêtre principale.

    Je souhaiterai savoir s'il est possible d'afficher la table une fois pour toute à l'écran, sans l'inscrire dans la fonction OnDraw() pour pas qu'elle soit rafraichit lorsque les billes bougent et qu'il y ait un effet scintillement absolument affreux ... merci d'avance !
    Salut,
    La solution classique consiste à utiliser un 'double buffer'. Tu dessines tout le temps dans un Memory DC et dans le draw tu te contentes de faire un blit. En général, ça évite ces différents effets de scintillement.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut
    D'accord, merci beaucoup pour la réponse je vais aller me renseigner un peu sur google et autres!

    Si quelqu'un a un exemple de code qui utilise le "double buffer" et qui marche je dis pas non hein

    Staticx83

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    L'idée est d'avoir un second CDC utilisé pour le dessin effectif, ensuite dans le draw tu fais un blit. Ca donnerait quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class MyView : public CView
    {
    /*[...]*/
    CDC m_mem_dc;
    };
    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
     
    void MyView::OnInitialUpdate()
    {
    /* [...] */
       CClientDC dc_view(this);
       m_mem_dc.CreateCompatibleDC(&dc_view);
    }
     
    void MyView::OnDraw(CDC *p_paint_DC)
     
    {
    /* [...] */
       m_mem_dc.Rectangle([...]);
       m_mem_dc.SelectObject([...]);
       // ...
       pDC->BitBlt( 0,0,p_paint_DC->GetWindowExt().cx,p_paint_DC->GetWindowExt().cy,
                         &m_mem_dc,
                         0,0,
                         SRCCOPY);
     
    }
    Code à la volée pour te donner un ordre d'idée.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 463
    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 463
    Par défaut
    Très souvent, le scintillement intempestif est lié au fait que la fenêtre se remplit de la couleur de fond (gris généralement) avant de faire l'affichage dans le OnPaint.

    Pour éviter cela, il y a plusieurs moyens comme, entre autre :
    - afficher les images au moment du remplissage du fond et non dans l’OnPaint
    - indiquer via un flag, lors de la création de la fenêtre je crois, qu'il ne faut pas afficher de couleur de fond pour la fenêtre
    - etc...

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Très souvent, le scintillement intempestif est lié au fait que la fenêtre se remplit de la couleur de fond (gris généralement) avant de faire l'affichage dans le OnPaint.

    Pour éviter cela, il y a plusieurs moyens comme, entre autre :
    - afficher les images au moment du remplissage du fond et non dans l’OnPaint
    - indiquer via un flag, lors de la création de la fenêtre je crois, qu'il ne faut pas afficher de couleur de fond pour la fenêtre
    - etc...
    Pas faux. Surcharger ERASE_BACGROUND et ne rien faire si le paint recouvre toute la zone client.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut
    Si j'ai bien compris, l'idée général du Double Buffer c'est de déclarer un deuxième CDC dans lequel on dessine comme on l'aurait fait dans le CDC d'origine puis qu'on recopie bit à bit. J'ai donc écrit le code suivant :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    void CBillardView::OnDraw(CDC* pDC)
    {
    	[...]
    	CRect rcClient;
    	GetClientRect(rcClient);
     
    	// création d'un contexte d'affichage en mémoire et d'un bitmap associé
    	CDC memDC;
    	memDC.CreateCompatibleDC(pDC);
    	CBitmap memBmp;
    	memBmp.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height());
    	CBitmap* pOldBmp = memDC.SelectObject(&memBmp);
     
    	// effacement du fond
    	CBrush backBrush;
    	backBrush.CreateSolidBrush(RGB(255, 255, 255));
    	memDC.FillRect(rcClient, &backBrush);
    	backBrush.DeleteObject();
     
    	// utilisation de memDC pour les dessins
     
    	CRect rect(X-LON1/2, Y+LAR1/2, X+LON1/2, Y-LAR1/2);
    	CBrush brush;
    	brush1.CreateSolidBrush(COULEUR1);
     
    	memDC.SelectObject(&brush);
    	memDC.Rectangle(rect);
     
    	// recopie du contexte en mémoire à l'écran
    	pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY);
     
    	// sélection anciens objets, destruction de ceux créés
    	memDC.SelectObject(pOldBmp);
    	memDC.DeleteDC();
    	memBmp.DeleteObject();
     
    	AffichageBille(pDoc->m_partie->TabBille[0],pDC);
     
    	// TODO : ajoutez ici le code de dessin pour les données natives
    }
    Seulement voilà, j'ai un timer de 5ms qui fait avancer une bille et donc appelle la fonction OnDraw à chaque échéance, et ma table continue de scintiller :S

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Staticx83 Voir le message
    Si j'ai bien compris, l'idée général du Double Buffer c'est de déclarer un deuxième CDC dans lequel on dessine comme on l'aurait fait dans le CDC d'origine puis qu'on recopie bit à bit. J'ai donc écrit le code suivant :
    C'est à peu près ça, sinon que la création d'un DC mémoire à chaque draw peut ne pas être très performant. AffichageBille ne fait pas d'affichage ? Sinon pourquoi ne pas lui passer le memDC et faire le blit après ?

    Citation Envoyé par Staticx83 Voir le message
    Seulement voilà, j'ai un timer de 5ms qui fait avancer une bille et donc appelle la fonction OnDraw à chaque échéance, et ma table continue de scintiller :S
    Essais ça :
    Citation Envoyé par 3DArchi Voir le message
    Pas faux. Surcharger ERASE_BACGROUND et ne rien faire si le paint recouvre toute la zone client.

Discussions similaires

  1. [AC-2010] Affichage permanent scrollbarr dans textbox
    Par francky57 dans le forum IHM
    Réponses: 0
    Dernier message: 27/09/2013, 16h42
  2. Problème dans la view(affichage calendrier)
    Par sajodia dans le forum MVC
    Réponses: 2
    Dernier message: 25/03/2011, 17h33
  3. [VB.NET] Affichage conditionnel dans un repeater
    Par NicoNGRI dans le forum ASP.NET
    Réponses: 4
    Dernier message: 07/02/2005, 12h58
  4. Réponses: 2
    Dernier message: 11/05/2004, 11h17
  5. Réponses: 2
    Dernier message: 10/06/2002, 11h03

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