Speicher wieder freigeben
-
is einfach nur stures zeichnen von Linien, Text und Rechtecken
Du wirst nicht glauben, wieviele Leute das denken und wie häufig der Fehler trotzdem auftritt.
Allerdings kann Dir ohne Quellcode niemand helfen!
-
OK! - Der Quellcode is ne gute Idee!!
Ist nicht gerade Professionell gemacht aber relativ Eindeutig
void CSeite1::OnPaint() { CPaintDC dc(this); // device context for painting //eigener code anfang long teiler, max1, min1, minmax1; switch(fall1) { case 1:{teiler = 1; max1=2760; min1=1380; minmax1=1380;break;} //500 case 2:{teiler = 1; max1=5520; min1=2760; minmax1=2760;break;} //250 case 3:{teiler = 2; max1=11000; min1=5520; minmax1=5480;break;} //125 case 4:{teiler = 4; max1=22100; min1=11000; minmax1=11100;break;} //60 case 5:{teiler = 8; max1=44200; min1=22100; minmax1=22100;break;} //30 } ///////////////////////// ////////zeichnen///////// ///////////////////////// //CClientDC dc(this); //grundierung CRect MyRectangle(2,2,615,240); dc.Rectangle(&MyRectangle); //schwarzer stift CPen BlackPen(PS_SOLID,1,RGB(0,0,0)); CPen* pOriginalPen; pOriginalPen = dc.SelectObject( &BlackPen ); //Messungwerte im Toleranzbereich?? // Textausgabe Mittelwert und median der 1. Messung if (M1x_tol == 15) dc.TextOut(10,225,"min. 1 Wert über max. Toleranzgrenze!!"); if (M1n_tol ==10) dc.TextOut(300,225,"min. 1 Wert unter min. Toleranzgrenze!!"); else{dc.TextOut(0,0,"");} //horizontal Linie X-Achse dc.MoveTo( 10, ((160*(max1-MedianS1))/minmax1+39)); dc.LineTo(612, ((160*(max1-MedianS1))/minmax1+39)); //Pfeil //horizontal X-Achse dc.MoveTo(607, ((160*(max1-MedianS1))/minmax1+39)+3); dc.LineTo(612, ((160*(max1-MedianS1))/minmax1+39)); dc.LineTo(607, ((160*(max1-MedianS1))/minmax1+39)-3); //vertikal Linie Y-Achse dc.MoveTo(15,7); dc.LineTo(15,238); //Pfeil //vertikal Y-Achse dc.MoveTo(12,12); dc.LineTo(15,7); dc.LineTo(18,12); //Toleranzenlinie (strich strich) //strich strich init CPen BlackDashPen(PS_DASH,1,RGB(0,0,0)); pOriginalPen = dc.SelectObject( &BlackDashPen ); //drüber dc.MoveTo( 15,39); dc.LineTo(612,39); //drunter dc.MoveTo( 15,199); dc.LineTo(612,199); //160 pixel Toleranzbereich //differenzen vom Median ->Ausgabe Grafik for (i=0;i<25;i++) { CPen BluePen(PS_INSIDEFRAME,10,RGB(0,0,255)); CPen* pOriginalPen; pOriginalPen = dc.SelectObject( &BluePen ); if (MedianS1<=MwertS1[i]) //oberer Zeichenbereich { CRect MyRectangle( 25+((i*23)+4), (((160*(max1-MedianS1))/minmax1)+39) - (((MwertS1[i] - MedianS1)*160)/minmax1), //höhe der X-Achse - (Mwert-Med) 25+(i+1)*23, ((160*(max1-MedianS1))/minmax1)+39 //"höhe" der X-Achse ); dc.Rectangle(&MyRectangle); } else //unterer Zeichenbereich { CRect MyRectangle( 25+((i*23)+4), ((160*(max1-MedianS1))/minmax1)+39, //"höhe" der X-Achse 25+(i+1)*23, (((160*(max1-MedianS1))/minmax1)+39) - (((MwertS1[i] - MedianS1)*160)/minmax1) //höhe der X-Achse - (Mwert-Med)); ); dc.Rectangle(&MyRectangle); } } //originalstift zurück dc.SelectObject(pOriginalPen); m_MittelS1 = MittelwertS1; m_MedianS1 = MedianS1; UpdateData(FALSE);
Thx A lot!!!!
MFG Bast
-
Ach ja :
das ist jetzt eine der 3 Registerkarten, die anderen beiden sehen genau so aus.
Die Reg-Karten werden mit den Befehlen Selchangtab und changetab (oder so) umgeschalten.
danke nochmal!
Bast
-
Na da haben wir doch schon den Fehler:
CPen BlackPen(PS_SOLID,1,RGB(0,0,0)); CPen* pOriginalPen; pOriginalPen = dc.SelectObject( &BlackPen); // richtig //strich strich init CPen BlackDashPen(PS_DASH,1,RGB(0,0,0)); pOriginalPen = dc.SelectObject( &BlackDashPen ); // falsch, pOriginalPen MUSS den Wert behalten, den er in Zeile 3 bekam !!!
-
AHA,
also muss da noch die übergabe rein ??
CPen* pOriginalPen;
oder wie meinst du das?
bast
-
Lass einfach bei jedem dc.SelectObject ausser dem 1. das
'pOriginalPen = '
weg.
-
Na dann versuch ichs mal !
Vielen Dank!!
MFGBAST
-
Hi nochmal..
ich hab es so geändert.Das Proggi funzt. Aber es tritt das gleiche Problem wieder auf.
void CSeite1::OnPaint() { CPaintDC dc(this); // device context for painting //eigener code anfang long teiler, max1, min1, minmax1; switch(fall1) { case 1:{teiler = 1; max1=2760; min1=1380; minmax1=1380;break;} //500 case 2:{teiler = 1; max1=5520; min1=2760; minmax1=2760;break;} //250 case 3:{teiler = 2; max1=11000; min1=5520; minmax1=5480;break;} //125 case 4:{teiler = 4; max1=22100; min1=11000; minmax1=11100;break;} //60 case 5:{teiler = 8; max1=44200; min1=22100; minmax1=22100;break;} //30 } ///////////////////////// ////////zeichnen///////// ///////////////////////// //CClientDC dc(this); //grundierung CRect MyRectangle(2,2,615,240); dc.Rectangle(&MyRectangle); //schwarzer stift CPen BlackPen(PS_SOLID,1,RGB(0,0,0)); CPen* pOriginalPen; pOriginalPen = dc.SelectObject( &BlackPen ); //Messungwerte im Toleranzbereich?? // Textausgabe Mittelwert und median der 1. Messung if (M1x_tol == 15) dc.TextOut(10,225,"min. 1 Wert über max. Toleranzgrenze!!"); if (M1n_tol ==10) dc.TextOut(300,225,"min. 1 Wert unter min. Toleranzgrenze!!"); else{dc.TextOut(0,0,"");} //horizontal Linie X-Achse dc.MoveTo( 10, ((160*(max1-MedianS1))/minmax1+39)); dc.LineTo(612, ((160*(max1-MedianS1))/minmax1+39)); //Pfeil //horizontal X-Achse dc.MoveTo(607, ((160*(max1-MedianS1))/minmax1+39)+3); dc.LineTo(612, ((160*(max1-MedianS1))/minmax1+39)); dc.LineTo(607, ((160*(max1-MedianS1))/minmax1+39)-3); //vertikal Linie Y-Achse dc.MoveTo(15,7); dc.LineTo(15,238); //Pfeil //vertikal Y-Achse dc.MoveTo(12,12); dc.LineTo(15,7); dc.LineTo(18,12); //Toleranzenlinie (strich strich) //strich strich init CPen BlackDashPen(PS_DASH,1,RGB(0,0,0)); dc.SelectObject( &BlackDashPen ); //drüber dc.MoveTo( 15,39); dc.LineTo(612,39); //drunter dc.MoveTo( 15,199); dc.LineTo(612,199); //160 pixel Toleranzbereich //differenzen vom Median ->Ausgabe Grafik for (i=0;i<25;i++) { CPen BluePen(PS_INSIDEFRAME,10,RGB(0,0,255)); dc.SelectObject( &BluePen ); if (MedianS1<=MwertS1[i]) //oberer Zeichenbereich { CRect MyRectangle( 25+((i*23)+4), (((160*(max1-MedianS1))/minmax1)+39) - (((MwertS1[i] - MedianS1)*160)/minmax1), //höhe der X-Achse - (Mwert-Med) 25+(i+1)*23, ((160*(max1-MedianS1))/minmax1)+39 //"höhe" der X-Achse ); dc.Rectangle(&MyRectangle); } else //unterer Zeichenbereich { CRect MyRectangle( 25+((i*23)+4), ((160*(max1-MedianS1))/minmax1)+39, //"höhe" der X-Achse 25+(i+1)*23, (((160*(max1-MedianS1))/minmax1)+39) - (((MwertS1[i] - MedianS1)*160)/minmax1) //höhe der X-Achse - (Mwert-Med)); ); dc.Rectangle(&MyRectangle); } } //originalstift zurück dc.SelectObject(pOriginalPen); m_MittelS1 = MittelwertS1; m_MedianS1 = MedianS1; UpdateData(FALSE);
Hat jemand noch ne Idee?? Ich tippe auf nen Speicherüberlauf. (??)
MFG Bast
-
Ok, das nächste Problem in Deinem Code:
for (i=0;i<25;i++) { CPen BluePen(PS_INSIDEFRAME,10,RGB(0,0,255)); dc.SelectObject( &BluePen ); }
Was passiert?
1. Schleifendurchlauf:
-Stift wird erstellt
-Stift wird in DC selektiert
- Destruktor des Stifts wird aufgerufen, Stift wird allerdings NICHT gelöscht, weil er noch selektiert ist.
2. Schleifendurchlauf:
-neuer Stift wird erstellt
...Problem erkannt?
-
Aha,
wäre sozusagen besser wenn ich den stift vor die scleife nehme- damit er nich immer neu erstellt werden muss...
?
Danke sagt bast