Je crois que mon problème ce trouve au niveau de ma fct de dessin OnDraw(). Il semble qu'après un nombre aléatoire de fois, mon programme me met un point en [0,0] pour je ne sais trop pour quelle raison et le programme gèle à ce momment. Sûrment dû à mon incompétence au niveau des boucles... et des listes chaînées...

Et également... je cherche un moyen à partir d'une thread, dans mon fichier --> CDathsProPaintDoc.cpp <--, de faire redessiner ma fenêtre. Je ne peut acceder à un pointer vers mon View, qui contient la fct RedrawWindow(). Seul le Frame peut avoir accès à ça, par la fct GetActiveWindow().
Le tout est un programme de type SDI, sous .Net

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
void CDathsProPaintView::OnDraw(CDC* pDC)
{
	CDathsProPaintDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
 
	// TODO : ajoutez ici le code de dessin pour les données natives
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
 
	int i = 0, code = -1;
	POINT current = {0, 0}, prev = {0, 0};
	CPen crayon(PS_SOLID, 3, RGB(0,0,0));
 
	pDC->SelectObject(&crayon);
	pDC->SelectStockObject(NULL_BRUSH);
 
	for(i = 0; i <= pDoc->m_NbPts; i++)
	{
		if(i == 0)	//il n'a aucune valeur, donc premier passage dans la boucle
		{
			prev = pDoc->m_Tableau.GetPointAtIndex(i); //m_Tableau est une variable de type STab
			current = prev;
			pDC->MoveTo(current);
		}
		else
		{
			prev = current;
			current = pDoc->m_Tableau.GetPointAtIndex(i);
		}
 
		if(current.x >= 0 && prev.x >= 0)	//si les points sont valides
		{
			switch(pDoc->m_Tableau.GetCodeAtIndex(i))
			{
				case 0:		//traitement du free-hand
			//----//-----------------------------------------------------------
							if(code == 0)
							{//le dernier point est aussi de code 0
								pDC->LineTo(current);
							}
							else
							{//trace un point unique
								pDC->MoveTo(current.x - 1, current.y - 1);
								pDC->LineTo(current);
 
								code = 0;	//on met le code pour le prochain passage
							}
							break;
 
				case 1:		//traitement de line
			//----//-----------------------------------------------------------
							if(code == 1)
							{//le dernier point est aussi de code 1
								pDC->LineTo(current);
								code = -1;
							}
							else
							{
								code = 1;	//on met le code pour le prochain passage
							}
							break;
 
				case 2:		//traitement de square
			//----//-----------------------------------------------------------
							if(code == 2)
							{//le dernier point est aussi de code 2
								pDC->Rectangle(prev.x, prev.y, current.x, current.y);
								code = -1;
							}
							else
							{
								code = 2;	//on met le code pour le prochain passage
							}
							break;
 
				case 3:		//traitement de cercle
			//----//-----------------------------------------------------------
							if(code == 3)
							{//le dernier point est aussi de code 3
								pDC->Ellipse(prev.x, prev.y, current.x, current.y);
								code = -1;
							}
							else
							{
								code = 3;	//on met le code pour le prochain passage
							}
							break;
			}// fin de: [ switch() ]
 
		pDC->MoveTo(current);	//réinitialise notre point d'ancrage
		}//fin de: [ if(current.x >= 0 && prev.x >= 0) ]
	}//fin de: [ for() ]
 
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
}