CBitmap in anderes CBitmap kopieren

thegrinch

Grünschnabel
Hallo!
Also, ich habe ne Klasse, der will ich eine CBitmap quasi übergeben. Aber nicht nur nen Zeiger darauf, sondern ich will, dass die Klasse eine eigene Kopie erhält. OK. Mit Bitmaps iss das ja scheinbar nciht so einfach. Also hab ich jetzt folgenden Code, der bei der Ausführung eine Assertion wirft (keine Ahnung wo :-():
Code:
BOOL ImageViewerDialog::SetBitmap(CBitmap* source)
{
	CClientDC cdc(this);

	CDC sourceDC;
	CDC targetDC;
	sourceDC.CreateCompatibleDC(&cdc);
	targetDC.CreateCompatibleDC(&cdc);
	
	sourceDC.SelectObject(source);
	targetDC.SelectObject(&m_Bitmap);
	
	BITMAP bm;
	source->GetBitmap(&bm);
	
	int sx, sy;
	sx = bm.bmWidth;
	sy = bm.bmHeight;
	
	targetDC.StretchBlt(0, 0, sx, sy, &sourceDC, 0, 0, sx, sy, SRCCOPY);  


	return true;
}
Vielleicht gibbet ja auch noch ne einfachere Methode, ich bin für alles offen!

Danke für eure Hilfe im Voraus!

euer grinch
 
Deine Idee ist soweit schon ok, eine einfachere Methode kenne ich auch nicht. Allerdings muss das Zielbitmap erst mal erzeugt werden (CreateCompatibleBitmap). Das Anlegen eines CBitmap-Objektes reicht nicht aus.
Den Absturz kann ich nicht erklären, allerdings solltest du beim Aufruf der SetBitmap-Methode ein evt. in m_Bitmap gespeichertes Bitmap löschen, sonst crasht es beim wiederholten Aufruf.
Bei SelectObject sollten am Schluss wieder die ursprünglichen GDI-Objekte zugewiesen werden, sonst gibt's GDI-Speicherlecks.
Hier die Änderungen:
C++:
BOOL ImageViewerDialog::SetBitmap(CBitmap* source)
{
    if( m_Bitmap.m_hObject != NULL )
    {
        m_Bitmap.DeleteObject();
    }

    CClientDC cdc(this);

    CDC     sourceDC;
    CDC     targetDC;

    BITMAP bm;
    source->GetBitmap(&bm);

    int sx, sy;
    sx = bm.bmWidth;
    sy = bm.bmHeight;

    m_Bitmap.CreateCompatibleBitmap(&cdc, sx, sy); // Das Bitmap muss erzeugt werden!!

    sourceDC.CreateCompatibleDC(&cdc);
    targetDC.CreateCompatibleDC(&cdc);
    
    CBitmap *pOldBitmapS = sourceDC.SelectObject(source);
    CBitmap *pOldBitmapT = targetDC.SelectObject(&m_Bitmap);
    
    targetDC.StretchBlt(0, 0, sx, sy, &sourceDC, 0, 0, sx, sy, SRCCOPY);  

    sourceDC.SelectObject(pOldBitmapS);
    targetDC.SelectObject(pOldBitmapT);

    return true;
}
Gruß
MCoder
 
Hallo!
Erstmal vielen Dank für deine Hilfe!
Hat mir sehr geholfen.

Ich weiss jetzt, wo die Assertion herkommt!
Sie kommt von der Zeile
Code:
CClientCD cdc (this);
Ist auch verständlich, denn die SetBitmap methode wird ja auch aufgerufen, bevor der Dialog angezeigt wird (Meine ImageViewerDialog-Klasse ist von CDialog abgeleitet !)
Nur, wo bekomme ich jetzt nen DeviceContext her? (Und zwar einen der nicht nur monochrom-bilder zeichnet)

Danke für die Hilfe im Voraus!
euer grinch
 
Zuletzt bearbeitet:
Du könntest den Device-Kontext des Bildschirms verwenden:
C++:
CDC cdc;
cdc.CreateDC(_T("Display"), NULL, NULL, NULL);
Gruß
MCoder
 
Zurück