Bitmap als Hintergrund
-
Hi...
Ich habe in meiner SDI-Anwendung ein Bitmap im ChildWindow als Hintergrund. Der Code sieht folgendermaßen aus:
BOOL CChildView::OnEraseBkgnd(CDC* pDC)
{
if (!m_bitmap.m_hObject) return TRUE;CRect rect;
GetClientRect(&rect);CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dc.SelectObject(&m_bitmap);
int bmw, bmh;
BITMAP bmap;
m_bitmap.GetBitmap(&bmap);
bmw = bmap.bmWidth;
bmh = bmap.bmHeight;
int xo=0, yo=0;#if 1
// mit 'Stretchen'.
pDC->StretchBlt(xo, yo, rect.Width(), rect.Height(), &dc, 0, 0,bmw,bmh, SRCCOPY);
#else
// ohne 'Stretchen'
pDC->BitBlt(xo, yo, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY);
#endif
dc.SelectObject(&m_bitmap);return TRUE;
}Das Dumme ist nur, dass das Stretchen bei langsameren Rechnern ziemlich lange dauert, so dass das Verschieben von Dialogen und Fenstern sehr träge vonstatten geht...
Könnte ich die eigentliche Stretch-Berechnung nicht aus der OnEraseBkgnd-Methode entfernen und diese in OnSize() unterbringen?
So bräuchte in OnPaint nurnoch das Bild gemalt werden, was ja nicht so lange dauert....
Hauptsache, ich kann meine Fentster wieder flüssig über den Hintergrund bewegen...Wie kann ich dieses Problem am elegantesten lösen?
Wie kann man ein Bitmap im Speicher stretchen, ohne es zu malen...
-
Im Speicher ein DC erzeugen, ein Bitmap in der OnSize() mit passender Größe erstellen und ins DC selektieren und StretchBlt durchführen. In der OnPaint dann nur BitBlt.
-
Original erstellt von Shaggy:
Im Speicher ein DC erzeugen, ein Bitmap in der OnSize() mit passender Größe erstellen und ins DC selektieren und StretchBlt durchführen. In der OnPaint dann nur BitBlt.Hi...
Irgenwie geht das nicht?!?!?
Hier mal mein (Schweine-)Code:CRect rect;
CDC dc2;BOOL CChildView::OnEraseBkgnd(CDC* pDC) {
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &dc2, 0, 0, SRCCOPY);
return TRUE;
}void CChildView::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
CDC dc;
GetClientRect(&rect);
dc.CreateCompatibleDC(GetDC());
CBitmap* pOldBitmap = dc.SelectObject(&m_bitmap);int bmw, bmh;
BITMAP bmap;
m_bitmap.GetBitmap(&bmap);
bmw = bmap.bmWidth;
bmh = bmap.bmHeight;
dc2.DeleteDC();
dc2.CreateCompatibleDC(GetDC());
dc2.StretchBlt(0, 0, rect.Width(), rect.Height(), &dc, 0, 0,bmw,bmh, SRCCOPY);
}Irgendwie malt er das "gestretchte" Bitmap nicht in "dc2"... wo liegt der Fehler?
-
Hier mal mein (Schweine-)Code:
Da kann ich nur zustimmen
:p
Mehr Fehler gehen ja fast gar nicht mehr rein, ohne dass es Compilerfehler gibt.BOOL CChildView::OnEraseBkgnd(CDC* pDC) { CDC dc; dc.CreateCompatibleDC( pDC); CBitmap* pOldBmp = dc.SelectObject( &m_bitmap2); pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &dc, 0, 0, SRCCOPY); dc.SelectObject( pOldBmp); return TRUE; } void CChildView::OnSize(UINT nType, int cx, int cy) { CWnd::OnSize(nType, cx, cy); CClientDC dcClient( this); GetClientRect(&rect); CDC dc1, dc2; dc1.CreateCompatibleDC( &dcClient); dc2.CreateCompatibleDC( &dcClient); CBitmap* pOldBmp1 = dc1.SelectObject(&m_bitmap); m_bitmap2.DeleteObject(); m_bitmap2.CreateCompatibleBitmap( &dc2, rect.Width(), rect.Height(); CBitmap* pOldBmp2 = dc2.SelectObject( &m_bitmap2); BITMAP bmap; m_bitmap.GetBitmap(&bmap); dc2.StretchBlt( 0, 0, rect.Width(), rect.Height(), &dc, 0, 0, bmap.bmWidth, bmap.bmHeight, SRCCOPY); dc2.SelectObject( pOldBmp2); dc1.SelectObject( pOldBmp1); }
So sollte das schon eher hinhauen.
-
Vergessen:
Vor StretchBlt sollte man noch dc2.SetStretchBltMode aufrufen, am besten mit dem Parameter COLORONCOLOR.
-
Original erstellt von RenéG:
Vergessen:
Vor StretchBlt sollte man noch dc2.SetStretchBltMode aufrufen, am besten mit dem Parameter COLORONCOLOR.Hey... es funktionniert.... ...fast!
Immerhin sehe ich nun das Bild in der richtige Größe, aber leider nur monochrom ?!?
Ich gucke mir die Sache mal näher an...
-
Original erstellt von Tobias123:
Hey... es funktionniert.... ...fast!
Immerhin sehe ich nun das Bild in der richtige Größe, aber leider nur monochrom ?!?
Ich gucke mir die Sache mal näher an...Alles klar... jetzt geht es...
Du hattest irgendwo einmal dc1 und dc2 vertauscht...
Super... vielen Dank!