Verständnisfrage: CBitmap vs. HBITMAP
-
Hallo zusammen,
ich hatte gerade ein aus meiner Sicht komisches Verhalten einer Applikation.
Im Konstruktor einer von CFrameWnd abgeleitetende Klasse hatte ich folgenden Code:
.. myStatic.Create(NULL, SS_BITMAP | SS_CENTERIMAGE | WS_VISIBLE | WS_CHILD , CRect(10,10,390,560), &m_CarPictureBox); CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); myStatic.setBitmap((HBITMAP)bitmap); ...
Das Bitmap wurde angezeigt, aber sobald ein teil verdeckt wurde, wurde es mit grauer Farbe (Standardfarbe von CStatic) überzeichnet.
Nach dem ich das Bitmap mit folgendem Code geladen hatte
... HBITMAP hBitmap = (HBITMAP) LoadImage( NULL, "C:\\Dokumente und Einstellungen\\extern_user1\\Eigene Dateien\\Skoda_Re\\bitmap2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); myStatic.setBitmap(hBitmap);
tratt das oben genannte Verhalten nicht mehr auf. Kann mir jemand erklären warum und wieso das so ist?
Wäre sehr dankbar...
Gruss
TobiPS.
Ich hatte auch versucht die CBitmap Variable als Membervariable abzulegen. Ohne Erfolg...
-
das Static hat die Hand auf dem Bitmap. Also es wird das Handel auch mit DeleteObject löschen. Deshalb bekommst man bei SetBitmap auch das letzte Bitmap zurück.
CBitmap löscht im Destructor das Bitmap. Womit es für das Static nicht mehr zur Verfügung steht. Eigentlich mußt Du es so machen:
CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); HBITMAP hBmp=myStatic.setBitmap(bitmap.Detach()); if(hBmp!=NULL) DeleteObject(hBmp);
Oder Du läßt das mit dem CBitmap ganz und benutzt halt das HBITMAP.
-
Hallo av_privat,
danke für die Antwort.
Auf den Destruktor von CBitmap hätte ich auch kommen können...Aber naja... Hab mich wohl bei der ersten Deklaration des CBitmap richtig vertan. Jetzt funktionierts, da die Membervariable ja erst stirbt, wenn auch das Objekt stirbt...
Danke nochmal
Gruss
Tobi