Vector in CBitmap schreiben: Debug Assertion
-
Hallo,
ich habe den Inhalt einer CBitmap in einen 2dimensionalen Vektor eingelesen, ihn dort verändert, und möchte ihn nun wieder in ein CBitmap zurückgeben, um ihn anzeigen zu lassen.
Hier der Code:CBitmap* PicIO::getDestBitmap(void) { // v_picture ist der Vektor, der als CBitmap* zurückgegeben werden soll CDC *pMemDC = new CDC; pMemDC->SelectObject(&pCBitmap_dest); for(int j=0;j<v_picture.size();j++) { for(int i=0;i<v_picture[0].size();i++) { pixel.SetRect(i,j,i+1,j+1); p_CBrOne.CreateSolidBrush(v_picture[j][i]); pMemDC->FillRect(pixel, &p_CBrOne); } } delete pMemDC; return pCBitmap_dest; }Anzeigen lasse ich das ganze so:
void Cbitmap_einlesenView::OnDraw(CDC* pDC) { CDC *pMemDC_2 = new CDC; BOOL bRetCode_2 = pMemDC_2->CreateCompatibleDC(pDC); ASSERT(bRetCode_2); CBitmap* pCBitmap_dest = pic_1->getDestBitmap(); pMemDC_2->SelectObject(pCBitmap_dest); pDC->StretchBlt( 200, 200, n_picWidth, n_picHeight, pMemDC_2, 0, 0, n_picWidth, n_picHeight, SRCCOPY); delete pMemDC_2; }Das ganze liefert einen wunderbaren Fehler "Debug Assertion Failed!". Als Fehlerhafte Quelle wird "wingdi.cpp" angegeben, Zeile 1102:
BOOL CGdiObject::Attach(HGDIOBJ hObject) { //in der folgenden Zeile tritt der Fehler auf ASSERT(m_hObject == NULL); // only attach once, detach on destroy if (hObject == NULL) return FALSE; CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist ASSERT(pMap != NULL); pMap->SetPermanent(m_hObject = hObject, this); return TRUE; }Kann mir jemand den Grund dieses Fehlers nennen? (Und eventuell wie er/sie darauf gekommen ist, denn ich tappe hier absolut im Dunkeln). Danke schonmal

-
Welche deiner Zeilen ruft denn diese Assertion ursprünglich hervor (siehe Callstack)?
-
Im ersten Codeabschnitt wird das in den DC gewählte Bitmap vor dem Löschen des DC nicht wieder herausgewählt.
-
... und pCBitmap_dest ist vermutlich nie erzeugt worden!
Das Handle ist NULL!
-
@ sri & Martin: ich habe die von euch genannten Mängel behoben. getDestBitmap(void) sieht jetzt wie folgt aus, an den anderen Methoden hat sich nichts geändert:
CBitmap* PicIO::getDestBitmap(void) { loadVector(); COLORREF m_Value; int n_picHeight, n_picWidth; HGDIOBJ CBitmap_save; pCBitmap_dest->FromHandle(m_hBitmap); CDC *pMemDC = new CDC; CBitmap_save = pMemDC->SelectObject(&pCBitmap_dest); TRACE("%d\n",CBitmap_save); for(int j=0;j<v_picture.size();j++) { for(int i=0;i<v_picture[0].size();i++) { pixel.SetRect(i,j,i+1,j+1); p_CBrOne.CreateSolidBrush(v_picture[j][i]); pMemDC->FillRect(pixel, &p_CBrOne); } //in dieser Zeile soll der Fehler liegen } pMemDC->SelectObject(&CBitmap_save); delete pMemDC; return pCBitmap_dest; }An der Fehlermeldung hat sich nichts geändert. Die Aufrufliste zeigt auf die im Code markierte Zeile. Es scheitert wieder an der ersten ASSERT-Anweisung im angegebenen Ausschnitt der wingdi.cpp.
Die Trace-Anweisung liefert "0" zurück, was der Fehlercode für CDC::SelectOBject() ist. Also liegt der Fehler nach wie vor an der Initialisierung von CBitmap_dest? m_hBitmap ist ein Handle auf ein zuvor eingelesenes Bitmap. Wie lang ist die Gültigkeit eines solchen Handles? Ich habe den Wert des Handles unmittelbar vor der AnweisungpCBitmap_dest->FromHandle(m_hBitmap);überprüft, er ist nicht NULL, daran kann es also eigentlich nicht liegen oder? Fragen über Fragen
