CreateCompatibleDC schlägt irgendwann fehl
-
Hallo,
ich zeichne in OnDraw ein Bild auf den Bildschirm und, falls vorher hinzugefügt, Linien über das Bild. Das ganze funktioniert auch zirka 1 bis 2 Minuten lang, wobei alles nach je 100 ms neu gezeichnet wird. Irgendwann erhalte ich die Meldung "Eine benötigte Resource ist nicht verfügbar" und im debug-Fenster erscheint:
Nicht abgefangene Ausnahme in Bilderkennung.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception. Thread 0x378 wurde mit Code 0 (0x0) beendet. Warning: Uncaught exception in WindowProc (returning 0).
CreateCompatibleDC liefert dann den Wert 0 zurück.
Hier der Quellcode:
void CBilderkennungView::OnDraw(CDC* pDC) { CBilderkennungDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen bool pictureOK; CMarkerList *pMarkerScanner; CLineList *pLineScanner; switch( m_KindOfPicture ) { case 0: { pictureOK = ShowStoredPicture( pDC ); //Bild aus der Datei zeichnen break; } case 1: { pictureOK = ShowCamPicture( pDC ); //Bild von der FrameGrabber-Karte zeichnen break; } } if( pictureOK ) //Wenn Bild OK... { //Verkettete Liste abarbeiten pLineScanner = m_pFirstLine; while( pLineScanner != NULL ) { if( pLineScanner->Line.GetDeleteState() == true ) { RemoveLine( &pLineScanner ); } else { pLineScanner->Line.Show( pDC ); //Linie zeichnen pLineScanner = pLineScanner->pNextLine; } } //Verkettete Liste abarbeiten pMarkerScanner = m_FirstMarker; while( pMarkerScanner != NULL ) { if( pMarkerScanner->Marker.GetDeleteState() == true ) { RemoveMarker( &pMarkerScanner ); } else { pMarkerScanner->Marker.Show( pDC ); //Makierung zeichnen pMarkerScanner = pMarkerScanner->pNextMarker; } } } }
bool CBilderkennungView::ShowCamPicture( CDC *pDC ) { CBitmap tempCBitmap, *pOldBMP; CDC *pTempDC; bool retValue; BOOL bRetCode = 1; m_IsPictureUpsideDown = false; retValue = false; m_OriginalBitmap = GetBitmap( 0 ); // temporäres DC erstellen pTempDC = new CDC; if(( pTempDC != NULL ) && ( m_OriginalBitmap.bmBits != NULL )) { bRetCode = pTempDC->CreateCompatibleDC(NULL); // ASSERT(bRetCode); if( bRetCode != 0 ) { // temp. CBitmap-Objekt fuer geladene Bitmap erstellen tempCBitmap.CreateBitmapIndirect(&m_OriginalBitmap); // Groesse und Anzahl der darstellbaren Farben des Speicher-DCs // auf Bitmap-Aufloesung einstellen pOldBMP = pTempDC->SelectObject(&tempCBitmap); // Bitmap-Daten nun aus dem Speicher auf den Bildschirm kopieren pDC->BitBlt( m_PictureStart.x, m_PictureStart.y, m_OriginalBitmap.bmWidth, m_OriginalBitmap.bmHeight, pTempDC, 0, 0, SRCCOPY); retValue = true; pTempDC->SelectObject(pOldBMP); } else { return false; } } //DeviceContext Zuweisung aufheben und löschen this->ReleaseDC( pTempDC ); pTempDC->DeleteDC(); return retValue; }
void CLine::Show( CDC *pDC ) { CPen *neuerStift, *alterStift; neuerStift = new CPen(PS_SOLID, m_Width, m_Color); alterStift = pDC->SelectObject(neuerStift); pDC->MoveTo( m_StartPointAbsolute ); pDC->LineTo( m_EndPointAbsolute ); pDC->SelectObject( alterStift ); }