bitmaps flimmern
-
ich male mehrere bitmaps auf meine dc aba des flimmert sehr stark?? kann mir da jemand helfen???
-
Ist ein alter hut, aber ich erkläre es nochmal.

Wenn du mehrere Bitmaps gleichzeitig zeichnen möchtest, die höchstwahrscheinlich übereinander liegen, (z.B. Hintergrundbild und darauf andere sachen) dann flimmert es meist. Warum?
Besonders große Bilder überschreiben die kleinen, so dass sie für einen ganz kurzen moment nicht sichbar sind. Das nimmt man dann als flimmern wahr.Die Lösung des Problems ist so genanntes Backbuffering. Anstatt alle Bilder hintereinander direkt auf den Gerätekontext des Fensters zu zeichnen, zeichnet man alle in einen Zwischen-Gerätekontext, dem sogenannten Backbuffer. Diesen Backbuffer Blittet man dann in den Frontbuffer (Der Zeichenbereich des Fensters) und es gibt kein flimmern mehr, da nur noch das fertige Bild gezeichnet wird.
Vom Prinzip funktioniert es genauso wie das "Normale" Zeichnen, du musst eben nur einen zwischenschritt machen. Zum Blitten kannst du je nach geschmack BitBlt oder wenn es Transparente Bilder sein dürfen TransparentBlt verwenden, wobei du da eine lib mitlinken musst, die ich gerade nicht im kopf hab. (Siehe MSDN)
-
buffer=CreateCompatibleDC(ps.hdc); PrintBackG(buffer); for(int i=0;i<BALL_N;i++) { PrintBmp(buffer,changepixX(Movement.Baelle[i].KugelPos.x),changepixY(Movement.Baelle[i].KugelPos.y),Movement.Baelle[i].Flag); } BitBlt(ps.hdc,0,0,width,height, buffer,0,0, SRCCOPY);aber es blittet die dc nicht da rein!!! Die Funktionen stimmen das ist sicher(PrintBackG u. PrintBmp) da sie ohne doublebuffering funktioniert haben!
-
Nikolausii schrieb:
buffer=CreateCompatibleDC(ps.hdc); PrintBackG(buffer); for(int i=0;i<BALL_N;i++) { PrintBmp(buffer,changepixX(Movement.Baelle[i].KugelPos.x),changepixY(Movement.Baelle[i].KugelPos.y),Movement.Baelle[i].Flag); } BitBlt(ps.hdc,0,0,width,height, buffer,0,0, SRCCOPY);aber es blittet die dc nicht da rein!!! Die Funktionen stimmen das ist sicher(PrintBackG u. PrintBmp) da sie ohne doublebuffering funktioniert haben!
Mal davon abgesehen, dass deine Fehlerbeschreibung etwas dürftig ist und mir auch (logischerweise) nicht klar ist was PrintBackG(buffer); tut, vermute ich das du keine Bitmap in den BackBuffer selektiert hast.
-
nope hab ich gemacht!
void PrintBackG(HDC littlewin)//Background { HDC hdcMem = CreateCompatibleDC(littlewin); SelectObject(hdcMem,BACKG); BitBlt(littlewin,0,0,width,height, hdcMem,0,0, SRCCOPY); DeleteDC(hdcMem); }oder meinst du
void PrintBackG(HDC littlewin) { SelectObject(littlewin,BACKG); }geht leider auch nicht

-
Ich weiß nicht warum du das alles in Funktionen gekapselt - in meinen Augen
Schwachsinn - aber guck dir |_das_|
mal an...kann dir leider jetzt kein Code schreiben, da ich ATM keine Zeit hab
-sry-