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ß


Log in to reply