// Wenn die Funktion Draw() folgendermaßen aussieht kann die RessourceException innerhalb ~ 25 Minuten provoziert werden // Es gibt dann eine Exception beim Erstellen der CPens unsigned long c = 0; for(;;) // TEST!!! ENDLOSSCHLEIFE!!! { TRACE(_T("Draw()-Durchlauf: %ld\n"), ++c); static bool first = true; CStdMemDC memDC(dc, m_staticRect); CPen linePen = CPen(PS_SOLID, 2, crdarkblue); CPen limitPen = CPen(PS_SOLID, 1, crdarkgreen); CPen gridPen = CPen(PS_SOLID, 1, crdarkgray); CPen fontPen = CPen(PS_SOLID, 1, crblack); LOGFONT lf; Compat_GetLogFont(&lf); lf.lfHeight = 14; lf.lfWeight = FW_NORMAL; #ifdef WINCE lf.lfWidth = 5; #endif CFont axisFontHori, axisFontVert; axisFontHori.CreateFontIndirect(&lf); lf.lfEscapement = 900; axisFontVert.CreateFontIndirect(&lf); GetClientRect(&m_staticRect); m_staticRectHeight = m_staticRect.bottom - m_staticRect.top; m_staticRectWidth = m_staticRect.right - m_staticRect.left; SetTrendRect(); if (first) { // Hintergrund wird nur einmal gezeichnet und dann abgespeichert, damit er wieder geladen und angezeigt werden kann dc->FillSolidRect(&m_staticRect, crdlghinter); m_dc_oldPen = dc->SelectObject(&gridPen); // Alten Pen merken dc->SelectObject(&limitPen); dc->SelectObject(&fontPen); //dc->SelectObject(m_dc_oldPen); // Alten Pen zurückschreiben, sonst anscheinend MemoryLeak // Hintergrundbild speichern m_bkgrndCDC.CreateCompatibleDC(dc); m_bkgrndBitmap.CreateCompatibleBitmap(dc, m_staticRect.Width(), m_staticRect.Height()); m_bkgrndCDC.SelectObject(m_bkgrndBitmap); // Kein Sichern von 'oldBitmap', da diese NULL ist m_bkgrndCDC.BitBlt(m_staticRect.left, m_staticRect.top, m_staticRect.Width(), m_staticRect.Height(), dc, m_staticRect.left, m_staticRect.top, SRCCOPY); first = false; } // Gespeichertes Hintergrundbild laden if (0 == memDC.BitBlt(m_staticRect.left, m_staticRect.top, m_staticRect.Width(), m_staticRect.Height(), &m_bkgrndCDC, m_staticRect.left, m_staticRect.top, SRCCOPY)) { first = true; continue; } if (-1 != CDlgTrend::sm_comboBoxValueSel) { // Wenn in der ComboBox ein Wert zur Anzeige ausgewählt wurde } else //if (true == dtOk) { // Wert sichtbar, Daten vorhanden und Datentyp des gewählten Wertes ist für Anzeige geeignet m_memDC_oldFont = memDC.SelectObject(&axisFontVert); // Alte Font merken memDC.SetBkMode(TRANSPARENT); memDC.SelectObject(&axisFontHori); // Schrift für aktuellen Wert auswählen m_memDC_oldPen = memDC.SelectObject(&linePen); // Alten Pen merken memDC.SelectObject(&axisFontHori); memDC.SetBkMode(TRANSPARENT); //memDC.SelectObject(m_memDC_oldFont); // Alte Font zurückschreiben, sonst anscheinend MemoryLeak //memDC.SelectObject(m_memDC_oldPen); // Alten Pen zurückschreiben, sonst anscheinend MemoryLeak } }