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

wxWidgets Discussion :

Utilisation de wxBufferedDC


Sujet :

wxWidgets

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 188
    Points : 143
    Points
    143
    Par défaut Utilisation de wxBufferedDC
    Bonjour,

    Tout est dans la question ou presque. Pour préciser, j'ai un wxPanel pour lequel je voudrais utiliser un double buffer (pour éviter les scintillements). Ce contrôle en contient d'autres mais je ne dessine PAS dedans, donc pour l'instant je n'ai pas d'évènement OnPaint() dans mon code (c'est à dire que ma question ne porte pas sur l'utilisation de wxBufferedPaintDC, car pour celui-ci je vois comment ça marche).

    Et je ne vois comment implémenter ce truc !

    Merci

    Windows XP + wxWidgets 2.8.9 + gcc

  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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Avant de mettre en place le double buffering, essaie de gérer le background pour atténuer les problèmes de scintillement. Souvent, ça suffit : cf ici.

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 188
    Points : 143
    Points
    143
    Par défaut
    Bon, j'ai bien essayé les méthodes dans le thread indiqué, mais cela n'atténue pas le scintillement.

    Dans mon cas, c'est un affichage en plein écran ou presque mais les contrôles ne prennent pas tout l'arrière plan, donc je ne peux pas court-circuiter le OnEraseBackground.

    Je voudrais donc essayer un double buffering mais je ne vois toujours pas comment faire sans méthode OnPaint(), ce qui est mon cas.

  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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    En utilisant un wxBufferDC tout simplement conjointement avec un wxClientDC ?

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 188
    Points : 143
    Points
    143
    Par défaut
    Désolé 3DArchi, je vois bien dans la doc que wxBufferedDC pourrait convenir à mon problème, mais je ne vois pas comment implémenter cette solution. Existe-t-il un exemple de code ?

  6. #6
    Membre à l'essai

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Salut plusieurs solutions s'offre à toi (je fais ça de tête)
    Une première qui ne prend pas compte du OnPaint event:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void TracerMonDessin()
    {
    	wxClientDC dcClient(pointeur_de_ton_wxPanel);  // Ou this si la méthode se trouve dans ta classe dérivée de wxPanel
    	wxBufferedDC dcBuffered(&dcClient, pointeur_de_ton_wxPanel->GetSize());
     
    	// Tu trace ce que tu veux à dans ton BufferedDC
    }
    Un deuxième méthode qui permet de gerer le OnPaint event en même temps
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    // Dans ton .h
    // Je considère que tout le travail se fait dans ta classe hérité de wxPanel
     
    class CustomPanel : public wxPanel
    {
    private:
    	// Attribut de classe
    	wxMemoryDC * m_pMemoryDC;
    	wxClientDC * m_ClientDC;
    	wxBitmap m_BufferBitmap; // La bitmap utilisé par le MemoryDC
    public:
    	CustomPanel();
    	~CustomPanel();
     
    	void TracerMonDessin();
    	void OnPaint(wxPaintEvent &event)
    };
     
    // Dans ton .cpp
     
    CustomPanel::CustomPanel()
    {
    	m_ClientDC = new wxClientDC(this);
    	m_BufferBitmap = wxBitmap(this->GetClientSize().GetWidth(), this->GetClientSize().GetHeight());
    	m_pMemoryDC = new wxMemoryDC( m_BufferBitmap );
    }
     
    CustomPanel::~CustomPanel()
    {
    	if ( NULL != m_pMemoryDC )
    	{
    		delete m_pMemoryDC;
    	}
     
    	if ( NULL != m_ClientDC )
    	{
    		delete m_ClientDC;
    	}
     
    }
     
    // Ta méthode de tracé
    void CustomPanel::TracerMonDessin()
    {
    	// Tu trace ce que tu veux dans ton MemoryDC
     
    	// Tu blit ton memoryDC dans ton clientDC
    	this->m_ClientDC->Blit(0,0,m_BufferBitmap.GetWidth(),m_BufferBitmap.GetHeight(),m_pMemoryDC,0,0);
    }
     
    // Le OnPaint event
    void CWxPresentationView::OnPaint(wxPaintEvent &event)
    {
       wxPaintDC PaintDC(this);
     
       // Tu blit ton memory DC dans le PaintDC de cette façon tu réutilise tout le temps l'image que tu as tracé
       PaintDC.Blit->Blit(0,0,m_BufferBitmap.GetWidth(),m_BufferBitmap.GetHeight(),m_pMemoryDC,0,0);
    }
    Voila
    ++

    Edit: Oups j'avais pas regardé la date du message, désolé

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 188
    Points : 143
    Points
    143
    Par défaut
    Merci. Même si c'est effectivement un peu loin la réponse m'intéresse toujours.

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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