Hoi,
Ik loop al een tijdje tegen een vage bug aan waarvan ik de oorzaak maar niet kan achterhalen. De situatie:
Voor de weergave van een grafiek, die veranderlijk is door met de muis over het dingetje te slepen, trigger ik in een bepaald geval voor iedere OnMouseMove event voor een venstertje een repaint aan met
Vervolgens wordt in OnDraw de volgende code uitgevoerd:
Ik weet dat ik niet al te gratieus codeer, ben dan ook geen programmeur maar elektrotechnicus van beroep. Sorry
Het vage is nu dat na deze functie een keer of wat is aangeroepen (niet te debuggen waar precies, geen aanwijzbare directe oorzaak) de kleuren van mijn cpen's zwart worden. Zelf zat ik te denken aan een onopgeruimd opbject ergens, maar die kan ik nergens vinden, ook niet buiten deze functie. Bovendien blijft het geheugengebruik erg bescheiden.
Iemand enig idee?
Ik loop al een tijdje tegen een vage bug aan waarvan ik de oorzaak maar niet kan achterhalen. De situatie:
Voor de weergave van een grafiek, die veranderlijk is door met de muis over het dingetje te slepen, trigger ik in een bepaald geval voor iedere OnMouseMove event voor een venstertje een repaint aan met
code:
1
| InvalidateRect(NULL,false); |
Vervolgens wordt in OnDraw de volgende code uitgevoerd:
code:
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
| void CCdcView::OnDraw(CDC* pDC)
{
CCdcDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CPen *oldPen;
try { // gekunstelde try catch om te checken dat er geen ontoelaatbare dingen gebeuren
CRect clientArea;
GetClientRect(&clientArea);
int height = clientArea.Height();
int width = clientArea.Width();
if(resize) { // resize is true via OnSize event en bij eerste aanroep
background.CreateCompatibleBitmap(pDC, width, height);
pDC->FillRect(clientArea, &CBrush(RGB(0,0,0)));
resize = false;
}
try {
calculate();
} catch(...) { // alle mogelijke fouten (divide by zero... etc)
exit(0);
};
CDC dc;
dc.CreateCompatibleDC(pDC);
dc.SelectObject(background);
dc.BitBlt(0,0, width, height, NULL, 0,0, BLACKNESS); // zwarte achtergrond
CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(80,80,200)); // binnen dc nog niets geselecteerd dus hoef de oude cpen ook niet op te slaan, right?
dc.SelectObject(pen);
pen.DeleteObject(); // kan ook aan het einde van de functie, maakt niet uit
// bereken verschaling
float schaal_x = (float) (clientArea.Width() / 117);
float schaal_y = (float) (clientArea.Height() / 45);
// bell filter
CPen pen2;
pen2.CreatePen(PS_SOLID, 1, RGB(255,0,0));
dc.SelectObject(pen2);
pen2.DeleteObject();
dc.MoveTo( 0,
(int)((height-calc_results[1] * schaal_y) - height/2) // calc_result is een array dat wordt gevuld door calculate(), waarden voor x en y vallen gegarandeerd binnen mn client area
);
for(int i=2; i<129; i++) { // tekent de grafiek
dc.LineTo(
(int)(i*schaal_x),
(int)(height-calc_results[i] * schaal_y) - height/2);
}
top = CPoint((int)(fc * schaal_x), // en een mooi groen vakje aan de top
(int) ((height-calc_results[fc] * schaal_y) - height/2) );
CPen pen3;
pen3.CreatePen(PS_SOLID, 2, RGB(0,255,0));
dc.SelectObject(pen3);
pen3.DeleteObject();
dc.Rectangle(top.x-2, top.y-2, top.x+2, top.y+2);
if( ((height-calc_results[fc] * schaal_y) - height/2) < height/2)
pDC->ExcludeClipRect(0,(int)(height/2)+height/5, width, height);
else
pDC->ExcludeClipRect(0, 0, width, (int)(height/2)-height/5);
pDC->BitBlt(0,0, width, height, &dc, 0,0, SRCCOPY); // kopieeren dc naar huidige context
dc.DeleteDC();
}
catch(...) {
exit(0); // knalt er noooit uit
};
} |
Ik weet dat ik niet al te gratieus codeer, ben dan ook geen programmeur maar elektrotechnicus van beroep. Sorry
Het vage is nu dat na deze functie een keer of wat is aangeroepen (niet te debuggen waar precies, geen aanwijzbare directe oorzaak) de kleuren van mijn cpen's zwart worden. Zelf zat ik te denken aan een onopgeruimd opbject ergens, maar die kan ik nergens vinden, ook niet buiten deze functie. Bovendien blijft het geheugengebruik erg bescheiden.
Iemand enig idee?