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 :
Cette fonction doit ré-afficher la fenêtre à chaque tour de boucle.
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); } }
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?
Partager