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 :

Problème avec Gdiplus


Sujet :

MFC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut Problème avec Gdiplus
    Bonjour, j'ai un petit problème avec la librairie GDI...

    Dans une fonction CStartingGDIPlusDlg::OnOk(), j'ai une boucle dans laquelle la fonction suivante est appelée :

    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
     
    void CStartingGDIPlusDlg::DrawWorld(const _World& World) {
    	using namespace Gdiplus;
    	CPaintDC dc(this);
    	Graphics graphics(dc.m_hDC);
    	SolidBrush Bred (Color::Red);
    	SolidBrush Bgreen (Color::Green);
    	SolidBrush BLightSkyBlue (Color::LightSkyBlue);
    	graphics.Clear(Color::Black);
    	SendMessage(WM_PAINT, (WPARAM) dc.GetSafeHdc(), 0);       //Pour "forcer" le graphic.Clear immédiatement
    	const int Res = 2;
    	for (list<_Point>::const_iterator i = World.Obstacle.begin() ; i != World.Obstacle.end() ; i++) {
    		graphics.FillRectangle(&Bred,i->first*Res,i->second*Res,Res,Res);
    	}
    	_Point Pt = World.FourmisColony.begin()->Fourmis.begin()->GetCible();
    	graphics.FillRectangle(&Bgreen,Pt.first*Res,Pt.second*Res,Res,Res);
    	for (vector<_Fourmis>::const_iterator i = World.FourmisColony.begin()->Fourmis.begin() ; i != World.FourmisColony.begin()->Fourmis.end() ; i++ ) {
    		graphics.FillRectangle(&BLightSkyBlue,i->GetCurCoord().first*Res,i->GetCurCoord().second*Res,Res,Res);
    	}
    }
    Cette fonction doit ré-afficher la fenêtre à chaque tour de boucle.

    Au premier appel, tout se passe bien.

    Au second appel (et pour tous les autres), tout se passe comme si mes appels graphiques étaient ignorés, je vois en mode debug que les divers instructions sont executées, mais malgré les appels graphics.Clear et les graphics.FillRectanlge, la fenêtre reste telle qu'elle était après le 1er appel. Pire, si je passe par-dessus ma fenêtre avec une autre, mon application fini par se fige et se "coince" (?) dans du code compilé sans source disponible...

    J'ai essayé avec ou sans la ligne SendMessage(WM_PAINT, (WPARAM) dc.GetSafeHdc(), 0);
    J'ai essayé d'appeler graphics.Flush...

    Quelle est la bonne méthode pour que cette fonction marche à chaque appel?

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2004
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 122
    Par défaut
    Salut,
    Pourquoi cette méthode est-elle appelée par une boucle, c'est bizarre, cette méthode devrait être appelée automatiquement à chaque fois que ta fenêtre est redessinée non ?
    Ta boucle ne bouclerait-elle pas indéfiniment par hasard ?

  3. #3
    mat.M
    Invité(e)
    Par défaut
    J'ai essayé avec ou sans la ligne SendMessage(WM_PAINT, (WPARAM) dc.GetSafeHdc(), 0);
    Qu'est ce que c'est que ce bricolage ?
    Encore une fois qqu'un qui n'a pas compris comment gérer les dessins sur l'affichage.
    On n'appelle jamais WM_PAINT comme cela mais avec Invalidate ou OnPaint.

    Il faut appeler DrawWorld dans CDialog::OnPaint et non l'inverse !

    //Pour "forcer" le graphic.Clear immédiatement
    Il suffit d'appeler Invalidate avec FALSE pour faire cela

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut
    Bien, je commence par un précision : je sous-signé supernoob débute en programation windows et je n'ai effectivement pas compris comment gérer les dessins sur l'affichage, d'où mon sujet.

    En fait, je crois, peut-être à tort, que OnPaint() n'est appelé que lorsque la fenêtre est partiellement effacée et a besoin d'être redessinée.

    Dans mon cas, je veux que le contenu de ma fenêtre soit redéssiné à chaque tours d'une boucle, afin de suivre l'évolution de paramètres à chaque iterations de cette boucle (des positions par exemple), sans interventions exterieurs

    Si j'appelle moi-même OnPaint(), cela va-t-il automatiquement redessiner la fenêtre ?

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par supernoob
    Bien, je commence par un précision : je sous-signé supernoob débute en programation windows et je n'ai effectivement pas compris comment gérer les dessins sur l'affichage, d'où mon sujet.
    Y'a pas de mal de toute façon je ne maitrise pas forcément tout à 100%
    Dsl d'avoir répondu à l'emporte-pièce
    Si j'appelle moi-même OnPaint(), cela va-t-il automatiquement redessiner la fenêtre
    Oui ou sinon avec Invalidate().
    Voir les tutoriels sur le site

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut
    Ah Zut j'avais pas vu qu'un tutoriel existait sur le sujet, je vais voir ça

    Je vais aussi essayer de mettre ma fonction dans OnPaint()

    Merci!

    edit : Heu... De quel tutorial parle-tu exactement, le tuto c++ API32 ?

  7. #7
    mat.M
    Invité(e)
    Par défaut
    Non Farscape a fait un tutoriel sur MFC.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10
    Par défaut
    Ah au fait merci Mat.m, j'ai fini par y arriver grâce à la fonction Invalidate().

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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