tout le monde
Pour réaliser un programme de cartographie, je dois afficher dans une fenêtre une carte représentée par plusieurs polygones (vecteurs de points). J'ai donc un objet CARTEVECTORIELLE contenant un vecteur d’objet ZONE. Un objet ZONE contient 2-3 infos (string, int, … ) et … le polygone à tracer.
A chaque rafraîchissement de la fenêtre, je retrace toute la carte. Or, au bout d'un certain nombre de rafraîchissement de la fenêtre (événement WM_PAINT), mes polygones qui étaient avant dessinés pleins ne sont dessinés que par leurs bordures.
En plus, il devient impossible de faire des « imprim écran » parce qu’il me dit qu’il manque de mémoire.
En supprimant des lignes tour à tour, il s’avère que c’est l’appel des 4 lignes suivantes qui font exploser la consommation de mémoire et génère le bug (on passe de 5000ko à 5300ko en une cinquantaine de rafraîchissements, 5300ko il jette l’éponge) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 hbrush =CreateHatchBrush(6,couleur); SelectObject(hdc,hbrush); hpen=CreatePen(0,0,couleur); SelectObject(hdc,hpen);
Auriez vous une solution miracle ? Est-ce que le problème vient vraiment de là ou vous pensez que déjà, à votre avis, il y a des choses à corriger dans mes méthodes de dessin ?
Voici le code pour tracer la carte (c’est la méthode ‘tracer’ de la carte vectorielle qui est appelée dans le block case WM_PAINT: … break ; )
En vous remerçiant par avance pour vos idées
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 CarteVectorielle::tracer(HDC hdc,CanevasMercator* cm) { HBRUSH hbrush; HPEN hpen; for (int i=0;i<zones.size();i++) { COLORREF couleur=zones.at(i).getColor(); hbrush =CreateHatchBrush(6,couleur); //les 4 lignes qui font planter SelectObject(hdc,hbrush); hpen=CreatePen(0,0,couleur); SelectObject(hdc,hpen); zones.at(i).tracer(hdc,cm); } } void zone::tracer(HDC hdc,CanevasMercator* cm) { Polygone* ptemp=new Polygone(); *ptemp = cm->projette(polygone); // projette le polygone dans un canevas de mercator ptemp->tracer(hdc); delete ptemp; } void Polygone::tracer(HDC hdc) { POINT pt; POINT *p=new POINT[nbpoints+1]; for (int i=0;i<points.size();i++) { pt=POINT(); pt.x=points.at(i).x; pt.y=points.at(i).y; p[i]=pt; } Polygon(hdc,p,nbpoints); delete p; }
marco
Partager