Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Double Bufering

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.09.2006, 16:21 Uhr
mischa
Fragender


hi
ich mach mich grad an eine einfache animation ran-ein springender Ball-
denn Ball male ich mit der GDI funktion Ellipse. das funktioniert auch, der ball springt auch und so.In den Hintergrund hab ich ein Bitmap reingesetzt zu verschönerung aber der flimmert schrecklich. hier im forum hat man mir double bufering empfolen aber ich blick da net durch. im internet hab ich den code gefunden

C++:
HDC hdc = BeginPaint();
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hBM = CreateCompatibleBitmap(hdc, cxClient, cyClient);
SelectObject(hdcMem, hBM);

// Zeichenoperationen auf hdcMem

BitBlt(hDC, 0, 0, cxClient, cyClient, hdcMem, 0, 0, SRCCOPY);
DeleteObject(hBM);
DeleteDC(hdcMem);


daraus hab ich dann für mich den code gemacht


C++:
hdc=BeginPaint(hwnd,&ps);
hdcMem=CreateCompatibleDC(hdc);
hBM=CreateCompatibleBitmap(hdc,cxClient,cyClient);
SelectObject(hdcMem,hBM);

hdcMem2=CreateCompatibleDC(hdc);
SelectObject(hdcMem2,hBitmap[1]); //hBitmap[1] ist der Hintergrund
BitBlt(hdcMem,90,50,cxSource[1],cySource[1],hdcMem,0,0,SRCCOPY);

BitBlt(hdc,0,0,cxClient, cyClient,hdcMem,0,0,SRCCOPY);
DeleteObject(hBM);
DeleteDC(hdcMem);
DeleteDC(hdcMem2);
EndPaint(hwnd,&ps);


aber das läuft noch schlimmer
kann mir jemand vielleicht ein funktionierendes Beispiel geben oder sagen was ich falsch mache
--
Latein Unterricht ist die spätere Rache der Römer an den Germanen.

Dieser Post wurde am 30.09.2006 um 16:24 Uhr von mischa editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.10.2006, 11:24 Uhr
xXx
Devil


Naja ... es kommt halt darauf an, das du 1. einen 2. DC, der kompatibel zum 1. ist, erzeugst. Dann das Bild darein lädst und am Ende dann den 2. DC auf den 1.DC blittest...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.10.2006, 12:37 Uhr
~Monk
Gast



Zitat von mischa:
hi
ich mach mich grad an eine einfache animation ran-ein springender Ball-
denn Ball male ich mit der GDI funktion Ellipse. das funktioniert auch, der ball springt auch und so.In den Hintergrund hab ich ein Bitmap reingesetzt zu verschönerung aber der flimmert schrecklich. hier im forum hat man mir double bufering empfolen aber ich blick da net durch. im internet hab ich den code gefunden

C++:
HDC hdc = BeginPaint();
HDC hdcMem = CreateCompatibleDC(hdc);
HBITMAP hBM = CreateCompatibleBitmap(hdc, cxClient, cyClient);
SelectObject(hdcMem, hBM);

// Zeichenoperationen auf hdcMem

BitBlt(hDC, 0, 0, cxClient, cyClient, hdcMem, 0, 0, SRCCOPY);
DeleteObject(hBM);
DeleteDC(hdcMem);


daraus hab ich dann für mich den code gemacht


C++:
hdc=BeginPaint(hwnd,&ps);
hdcMem=CreateCompatibleDC(hdc);
hBM=CreateCompatibleBitmap(hdc,cxClient,cyClient);
SelectObject(hdcMem,hBM);

hdcMem2=CreateCompatibleDC(hdc);
SelectObject(hdcMem2,hBitmap[1]); //hBitmap[1] ist der Hintergrund
BitBlt(hdcMem,90,50,cxSource[1],cySource[1],hdcMem,0,0,SRCCOPY);

BitBlt(hdc,0,0,cxClient, cyClient,hdcMem,0,0,SRCCOPY);
DeleteObject(hBM);
DeleteDC(hdcMem);
DeleteDC(hdcMem2);
EndPaint(hwnd,&ps);


aber das läuft noch schlimmer
kann mir jemand vielleicht ein funktionierendes Beispiel geben oder sagen was ich falsch mache



Schau dir nochmal das Beispiel an das du verlink hast:

Dort hast du nur 2 Handel zu einem DC(hdc und hdcmem) - indem was du gemacht hast, hast du aber 3 Stück. (hdc, hdcmem + hdcmem2)

Hier blittest du in den selbe Context

C++:
BitBlt(hdcMem,90,50,cxSource[1],cySource[1],hdcMem,0,0,SRCCOPY);


hdcMem->hdcMem ? Ist das gewollt?

Scheint mir so, als hättest du da etwas kuddelmuddel drin?!

Dieser Post wurde am 02.10.2006 um 13:17 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.10.2006, 16:21 Uhr
mischa
Fragender


die zeile ist nur verschrieben im code hab ich schon hdcMem2->hdcMem
blos das hilft nicht es flimmert trotzdem aber warum ich zeichne doch zu erst alles is dem hdcMem und kopiere erst dann alles in den haubt dc: hdc
das ist doch der sinn von double buffering alles zu erst im "hintergrund" zeichnen und dann nach vorne hollen
--
Latein Unterricht ist die spätere Rache der Römer an den Germanen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.10.2006, 20:00 Uhr
~Monk
Gast



Zitat von mischa:
die zeile ist nur verschrieben im code hab ich schon hdcMem2->hdcMem
blos das hilft nicht es flimmert trotzdem aber warum ich zeichne doch zu erst alles is dem hdcMem und kopiere erst dann alles in den haubt dc: hdc
das ist doch der sinn von double buffering alles zu erst im "hintergrund" zeichnen und dann nach vorne hollen


ja, die Theorie ist richtig.

Mit
C++:
hdc=BeginPaint(hwnd,&ps);


holst dir den DC auf den gezeichnet wird, also der aktive. du brauchst eigentlich nur den hdcMem als zweiten DC wo du deine sachen rein schreibst/malst und dann in den hdc blittest. der hdcMem2 ist imo überflüssig.


C++:
hdcMem2=CreateCompatibleDC(hdc);
SelectObject(hdcMem2,hBitmap[1]); //hBitmap[1] ist der Hintergrund


Mal dein Bild doch einfach in hdcMem rein, wenn du das gemalt hast, Blittest du von hdcMem nach hdc - fertig.

ich bin selbst kein windows experte....aber imo ist das was du da machst sinnfrei. Dein Beispielcode ist doch eigentlich eine perfekte Grundlage.

2 DC. in einen malst du alles rein und blittest den dann in den aktiven.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.10.2006, 22:25 Uhr
mischa
Fragender


ok ich hab den code mal so umgeschrieben

C++:
hdc=BeginPaint(hwnd,&ps);
hdcMem=CreateCompatibleDC(hdc);
hbBuffer=CreateCompatibleBitmap(hdc,700,700);
SelectObject(hdcMem,hbBuffer);
SelectObject(hdcMem,hBitmap[1]);
BitBlt(hdc,90,50,cxSource[1],cySource[1],hdcMem,0,0,SRCCOPY);
DeleteDC(hdcMem);
EndPaint(hwnd,&ps);


aber es flimmert immernoch zwar nicht mer so stark aber
--
Latein Unterricht ist die spätere Rache der Römer an den Germanen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.10.2006, 11:57 Uhr
~Monk
Gast



Zitat von mischa:
ok ich hab den code mal so umgeschrieben

C++:
hdc=BeginPaint(hwnd,&ps);
hdcMem=CreateCompatibleDC(hdc);
hbBuffer=CreateCompatibleBitmap(hdc,700,700);
SelectObject(hdcMem,hbBuffer);
SelectObject(hdcMem,hBitmap[1]);
BitBlt(hdc,90,50,cxSource[1],cySource[1],hdcMem,0,0,SRCCOPY);
DeleteDC(hdcMem);
EndPaint(hwnd,&ps);


aber es flimmert immernoch zwar nicht mer so stark aber



kA wie stark das jetzt noch flimmert, aber absolute flimmerfreiheit wirst du mit Software-Backbuffering wohl kaum erreichen. Etwas flimmern bleibt - wobei das aber aufjedenfall ertragbarer ist, als wenn du alles direkt in das aktive hdc zeichnest.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
03.10.2006, 13:27 Uhr
mischa
Fragender


auf gut deutsch wenn ich es flimmer frei haben will sollte ich es mit openGL oder directX machen?
--
Latein Unterricht ist die spätere Rache der Römer an den Germanen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.10.2006, 13:50 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Nein schau dir mal auf Codeguru/CodeProject die eine Zeichenklasse an, die zeichnet per GDI inkl DoubleBuffering imho flimmerfrei.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
03.10.2006, 21:59 Uhr
mischa
Fragender


ok danke
--
Latein Unterricht ist die spätere Rache der Römer an den Germanen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: