Strahlrücklauf / Flimmern
-
Hallo!
Noch mal ne Frage:
Kann man in einem Fenster sozusagen auch nen Backbuffer und nen Frontbuffer erstellen?
Oder versuchen, auf den Strahlrücklauf des Monitors zu warten?Weil ich nämlich in meinenm Programm nicht auf Nachrichten warte, sondern mit PeekMessaage nur prüfe
und bei jedem Durchlauf wird mein Bild gezeichent. Das muss so sein, weil ich da ne Animation einbringen will.
ABer ich meine nur mit WinAPI, ohne DirectXGruß, Maxi
PS: Kann mich nicht mehr einloggen, irgendwie
-
Also Warten auf den Strahlrücklauf des Monitors kann man nicht, aber du kannst dir auch sozusagen einen BackBuffer erstellen (CreateCompatibleDC - CreateCompatibleBitmap) in dem du dann deine Zeichenoperationen durchführst. Bist du damit fertig blittest du ihn einfach in den "richtigen" DC (BitBlt). Stichwort: DoubleBuffering
-
Hm, danke erstmal für die Antwort. Aber so richtig funktionieren tut es noch nicht.
So wiet bin ich jetzt:HDC dc = GetDC(g_hWindow); HDC memdc = CreateCompatibleDC(dc); // Einen äquivalten DC im Speicher erstellen // in den gezeichnet wird. Nach dem Zeichnen // wird der gesamte DC mit einem mal in den originalen // kopiert. HBRUSH Brush = CreateSolidBrush(0x00FFFF00); HPEN Pen = CreatePen(PS_SOLID, 3, 0x00FF0000); SelectObject(memdc, Pen); SelectObject(memdc, Brush); Rectangle(memdc, m_Size.left, m_Size.top, m_Size.right, m_Size.bottom); for(int i = 0; i < m_AnzFische; i++) m_Fische[i].Render(&memdc); // m_Size gibt die Ausmaße des Stückes an, die ich kopieren will BitBlt(dc, 0, 0, m_Size.right - m_Size.left, m_Size.bottom - m_Size.top, memdc, 0, 0, SRCCOPY); ReleaseDC(g_hWindow, memdc); ReleaseDC(g_hWindow, dc);
Wenn ich das so mache, bleib der Fensterinhalt einfach weiß.
Kann mir jemand helfen?Gruß, Maxi
-
Eine Bitmap musst du noch reinselektieren (s. Beitrag von flenders).
Bei SelectObject muss der Rückgabewert gespeichert werden und vor dem Zerstören vom DC wieder selektiert werden.
Ein mit CreateCompatibleDC erzeugtes DC muss mit DeleteDC gelöscht werden.
-
CreateCompatibleBitmap fehlt
-
So, jetzt klappt es mit CreateCompatibleBitmap. Es flimmert nicht mehr.
Aber ich verstehe nicht, was ich da jetzt gemacht habe. Ich habe irgendein Bitmap erstellt und die irgendwie zugewiesen und dann zeichne ich irgendwas. Könnt ihr mir genauer erklären, was ich da eigetnlich jetzt gemacht habe?
-
Du zeichnest nicht mehr direkt in den DC deines Fensters, sondern in einen DC im Speicher. Wenn alle Zeichenoperationen beendet sind, wird dieser in den DC deines Fensters geblittet (wesentlich schneller, als die vielen Zeichenoperationen)
-
Hm, und wozu brauch ich dann eine Bitmap?
Was ist der DC eigentlich? Ist er das, worauf man zeichnet, oder ist er das Werkzeug zum Zeichnen auf eine Oberfläche?
-
Der DC ist eigentlich ein Handle auf den Speicher, in dem du eine Zeichenoperationen durchführst.
CreateCompatibleBitmap brauchst du, weil der mit CreateCompatibleDC erstellte DC zuerst monochrom und 1x1 Pixel groß ist. Dadurch, dass du das Bitmap hineinselektierst erhält der DC die Ausmaße des Bitmaps und dessen Farbtiefe