Bilder flimmern bei Bewegung
-
Hallo da drausen,
ich habe jetzt schon geraume Zeit die Suche durchwälzt zum Thema Double Buffering etc. Mein Problem ist das ich eine Bild (TImage) durch die Cursortasten(VK_UP, VK_DOWN) auf der Form bewegen will. Das geht auch soweit problemlos. Problem ist das es flackert. Also doch nicht ganz problemlos.
Durch die Suchfunktion dieser Page bin ich auf Double Buffering gekommen, allerdings habe ich keine Ahnung wie ich das in die oben beschriebene Struktur einbauen soll. Kann mir von euch da jemand helfen? Suche schon recht lang nach ner Lösung.
-
Mit der Suchenfunktion findet man ganz viel. Am Besten find ich den Beitrag:
http://c-plusplus.net/forum/viewtopic.php?t=14713Falls du nicht mit deinem Ergebnis zu frieden schau mal hier:
http://www.winapi.net/index.php?inhalt=tipp4mit beiden zusammen hast du dann kein Flackern mehr(zumindest ist das bi mir so)
mfg. FlyingDragon
-
Erst mal Danke für die schnelle Antwort.
Allerdings kenne ich beide Beispiele. Ich denke das es an meiner unwissenheit liegt das ich nicht verstehe wie ich das in in meinen Ablauf einbauen soll. muss ich das irgenwie zwischen ´das Tastaur Event VK_UP und dem Befehl
Image1->Top = Image1->Top + 10 schreiben oder wie soll das gehen. Am Besten wäre ein Beispiel wie man das mit dieser Methode macht. Sofern das überhaupt so machbar ist. Mit WM_Paint und konsorten habe ich noch nichts zu tun gehabt.
Die Benutze ich auch nicht für mein Programm
-
Hast du das Bild schon auf dein Fenster blitten können? Wenn ja, dann brauchst du den Code nur zwichen den Abschnit schreiben, wo du das Bild blittest.
Ich würde es so machen:
Zuerst einen Timer erstellen, z.B. mit eine Interval von 50ms. Dann würde ich ein Feld anlegen in dem ich den Tastaturstatus speichere. Jedes mal wenn der Timer aufgerufen wird, schauen welche Taste gedrückt wurde (im Feld nachschauen ob TRUE), und dann das Bild bewegen. Danach würde ich mit Invalidate() das Fenster auffordern neu zu zeichnen. Im Event WM_PAINT dann dein Bild mit Doublebuffering zeichnen.
Hier ein bissl Code:
BOOL g_Keys[255]; const in MyTimer = 1; ... case WM_CREATE: SetTimer(hWnd, myTimer, 50, NULL); ... case WM_TIMER: //dein Bild bewegen if(g_Keys[VK_UP]) { //z.B. Image.y -= 10; } InvalidateRect(hWnd,0,TRUE); //Fenster auffordern neu zu zeichnen .... case WM_PAINT: RECT rcClient; PAINTSTRUCT ps; BITMAP bm; GetClientRect(hWnd, &rcClient); HDC hDC = BeginPaint(hWnd, &ps); //Doublepuffering - Einen "Backbuffer" erstellen HDC hDC2 = CreateCompatibleDC(hDC); HBITMAP hBM = CreateCompatibleBitmap(hDC, rcClient.right, rcClient.bottom); SelectObject(hDC2, hBM); ... //Dein Bild zeichnen ... BitBlt(hDC,0,0, rcClient.right, rcClient.bottom, hDC2, 0,0, SRCCOPY); DeleteObject(hBM); DeleteDC(hDC2); EndPaint(hWnd,&ps); ... case WM_ERASEBKGND: return (1); // Rückgabe muss ungleich "0" sein! ... case WM_KEYDOWN: { //Taste wurde gedrückt g_Keys[wParam] = TRUE; return 0; } case WM_KEYUP: { //Taste wurde losgelasen g_Keys[wParam] = FALSE; return 0; } case WM_CLOSE: //Timer wieder löschen KillTimer(hWnd, ID_TIMER); DestroyWindow(hWnd); ...So wie ich das machen, würde das Bild sich auf jedem System gleichschnell bewegen, weil es immer 50ms wartet.
-
@FlyingDragon
Ich glaub nicht das er damit klar kommt, er arbeitet mit BCB und ohne WndProc FunktionBenutze mal die Suche im BCB Forum, auch mit dem begriff Spiel etc. da wurde das auch schon besprochen und halt mit BCB Komponenten
-
Dieser Thread wurde von Moderator/in flenders aus dem Forum WinAPI in das Forum Borland C++ Builder (VCL/CLX) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Seit BCB6 verfügen (fast?) alle von TWinControl abgeleiteten Objekte über die Eigenschaft DoubleBuffered, die sich zur Laufzeit setzen lässt. Da dann alles zweimal gezeichnet wird hat das natürlich Auswirkungen auf die Performance, du solltest die Option also auf einen möglichst kleinen Bereich beschränken. D.h. z.B. das Image auf ein Panel setzen, anstatt DoubleBuffered für die ganze Form zu aktivieren.