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