SelectObject() gibt mir den Parameter zurück?!
-
Hi!
Ich hab folgenden Code verbrochen:
void CDisplay::UpdateOffscreen() { if(m_foto != NULL) { BITMAP bm = m_foto->GetBITMAP(); if(m_memBMP == NULL) m_memBMP = new CBitmap; m_memBMP->CreateBitmap(m_offScreenSize.cx, m_offScreenSize.cy, bm.bmPlanes, bm.bmBitsPixel, NULL); CDC dc1; dc1.CreateCompatibleDC(NULL); CDC dc2; dc2.CreateCompatibleDC(NULL); HANDLE oldBMP1 = dc1.SelectObject(m_memBMP); HANDLE oldBMP2 = dc2.SelectObject(m_foto->GetHBITMAP()); dc1.BitBlt(0, 0, m_screenRect.Width(), m_screenRect.Height(), &dc2, 0, 0, SRCCOPY); dc1.StretchBlt(0, 0, m_offScreenSize.cx, m_offScreenSize.cy, &dc2, m_zoomRect.left, m_zoomRect.top, m_zoomRect.Width(), m_zoomRect.Height(), SRCCOPY); dc1.SelectObject(oldBMP1); dc2.SelectObject(oldBMP2); } }
Diese Zeile funktioniert nicht so wie ich mir das vorgestellt habe.
HANDLE oldBMP1 = dc1.SelectObject(m_memBMP);
Und zwar ist oldBMP1 danach nicht etwa NULL oder die Adresse des alten Bitmaps, sondern die Adresse von m_memBMP. Was hat das denn zu bedeuten? In der MSDN-Doku zu CDC::SelectObject wird der Fall gar nicht erwähnt.
Das BitBlt danach funktioniert dann natürlich auch nicht, returnt aber 1 (erfolgreich). Und StretchBlt funktioniert ebenfalls nicht, teilt mir das aber mit einer 0 wenigstens mit.Diese Zeile
HANDLE oldBMP2 = dc2.SelectObject(m_foto->GetHBITMAP());
funktioniert dagegen wie man es kennt. Neue Bitmap rein, alte Bitmap kommt als return-Wert.
Gruß
-
Ich habe den Fehler gerade gefunden. Es lag daran, dass beim Aufruf von
m_memBMP->CreateBitmap(m_offScreenSize.cx, m_offScreenSize.cy, bm.bmPlanes, bm.bmBitsPixel, NULL);
m_offScreenSize noch (0;0) war
Wenn ich das korrigiere, gibt mir dc1.SelectObject(m_memBMP) NULL zurück. Wenn ich m_memBMP dann noch mit CreateCompatibleBitmap erstelle, funktioniert es.Gruß