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 );
    }
    

Anmelden zum Antworten