Grafikausgabe ohne Flackern
-
Und wieso antwortet Ihr dann überhaupt? Wie gesagt, der Tip "Google" nützt niemandem was. Wenn Ihr also nichts Besseres zu bieten habt, könnt Ihr Euch den Kommentar doch generell vollständig verkneifen. Ihr habt den Fragenden dann auch nicht weniger geholfen, als wenn Ihr auf Google verwiesen hättet.
-
Die Frage ist wohl eher warum du überhaupt sowas fragst.
-
Die Frage ist wohl eher warum du überhaupt sowas fragst.
Hm, mal überlegen...Weil ich nicht weiß, wie es geht und trotz Suche bisher noch nichts gefunden habe, was mein Problem behebt?
Entweder beziehen sich die Lösungen auf reine WinAPI-Vorgänge (mit Handles etc.) oder es sind gleich ganze Klassen, die dann die Funktionalität für einen erledigen. Ich brauche aber eine ganz normale Standardmöglichkeit. Ich möchte einfach nur wissen, wie ich meine oben geschriebene Funktion erweitern muß, damit das ganze mit Double Buffering läuft. Keine WinAPI-Aufrufe, keine selbstgeschriebenen 100-Zeilen-Klassen. Einfach nur der Code, mit dem ich die obige Funktion erweitern muß.
Was ist denn jetzt so schwer daran, daß jemand, der weiß, wie es geht, mir das schnell hinschreibt? Wenn Ihr nur die Hälfte der Zeit, die Ihr mit schlaumeierhaften Bemerkungen gegenüber Fragenden verschwendet, benutzen würdet, um diesen Fragenden wirklich zu helfen, würden manche Leute hier viel eher zum Ziel kommen.Also, hat jemand, dem es auf diesem Forum tatsächlich darum geht, Fragen zu stellen und zu beantworten, statt Leuten, die bestimmte Sachen noch nicht so gut kennen wie er, mit sinnlosen Tips und Kommentaren hinzuhalten, eine Lösung für mein oben (im ersten Post) gestelltes Problem?
-
Bist du nicht in der Lage die WinAPI-Aufrufe nach MFC zu übersetzen?
-
Bist du nicht in der Lage die WinAPI-Aufrufe nach MFC zu übersetzen?
Offensichtlich nicht. Ich habe mal versucht, das ganze von www.catch22.net/tuts/flicker.asp zu übertragen, aber dann stürzt es ab. Außerdem weiß ich gar nicht, was das überhaupt soll: In diesem Tutorial wird erklärt, wie man Double Buffering realisiert und trotzdem arbeiten die nur mit einer Bitmap. Das ist auch nicht mehr als das, was ich schon habe. Ich brauche das für zwei oder mehr Bilder.
O.k., und nun möchte ich bitten, mir nur noch konstruktive Beiträge zu liefern. Das klingt vielleicht etwas arrogant, aber wenn man bloß irgedwelche Sprüche hört ohne auch nur einen Schritt weiterzukommen, dann hat man langsam genug. Also, wer mir helfen will, dem bin ich dankbar, aber wer weiterhin nur rumquatschen kann, den möchte ich bitten, sich das hier zu verkneifen und lieber gar nichts zu schreiben.
-
Kann man nicht einen zweiten Speicher anlegen, der dir immer die Bilder reinlädt und du diesen Speicher dann in den ersten MemoryDC blittest.
So hättest du doch dann alle Bilder in einem Speicher und kannst dann alle gemeinsam in das dc blitten.
Ich hoffe, ich habe mich nicht zu kompliziert ausgedrückt.
-
Ich hab das mal ausprobiert, aber so wie ich es gemacht habe, hat es nicht funktioniert.
Kannst Du mir einen "Codeschnipsel" hinschreiben?
-
Vielleicht habe ich heute abend dazu Zeit. Ich habe das nämlich auch noch nie gemacht, könnte mir aber vorstellen, dass das funktionieren müsste.
-
NES-Spieler zeig doch deinen Code wie du es ausprobiert hast.
-
NES-Spieler zeig doch deinen Code wie du es ausprobiert hast.
O.k., hier also ganz ausführlich:
Ich habe zwei Membervariablen für das Dialogfeld. Sie sind vom Typ CBitmap und heißen m_bmpHintergrund und m_bmpBild. In OnInitDialog schreibe ich
m_bmpHintergrund.LoadBitmap (IDB_HINTERGRUND); m_bmpBild.LoadBitmap (IDB_BILD);
Die Funktion OnPaint sieht so aus:
void CProgrammDlg::OnPaint () { CDC dc; CClientDC dcClient (this); BITMAP bm; dc.CreateCompatibleDC (&dcClient); m_bmpHintergrund.GetObject (sizeof (bm), &bm); dc.SelectObject (m_bmpHintergrund); dcClient.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &dc, 0, 0, SRCCOPY); m_bmpBild.GetObject (sizeof (bm), &bm); dc.SelectObject (m_bmpBild); dcClient.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &dc, 0, 0, SRCCOPY); CDialog::OnPaint (); }
Würde ich das Vordergrundbild jetzt bewegen (dann müßten die ersten zwei Parameter beim letzten BitBlt natürlich Variablenwerte haben) und bei jeder Bewegung OnPaint aufrufen, würde das Gesamtbild durch das zweimalige BitBlt natürlich flackern, da man immer für einen kurzen Moment den kompletten Hintergrund sieht, bevor das Vordergrundbild erscheint. Das ganze soll also erst komplett in einen Speicher-DC geblittet und dann dieser Speicher-DC auf dem Fenster ausgegeben werden. (Und zwar erstmal ohne InvalidateRect, er soll also jedesmal die gesamten Bitmaps neu blitten und nicht nur das veränderte Rechteck.)
-
Falls es jemanden interessiert: Ich habe die Lösung unter www.c-plusplus.net/forum/viewtopic-var-t-is-125857-and-start-is-20.html aufgeführt. Zusammen mit meinen Kommentaren über alle diese "Such mal in Google!"-Klugscheißer.
-
Paul_C. schrieb:
Kann man nicht einen zweiten Speicher anlegen, der dir immer die Bilder reinlädt und du diesen Speicher dann in den ersten MemoryDC blittest.
So hättest du doch dann alle Bilder in einem Speicher und kannst dann alle gemeinsam in das dc blitten.
Ich hoffe, ich habe mich nicht zu kompliziert ausgedrückt.Mir fällt auf, dass ich es ja noch ausprobieren wollt.
Aber wie mein Zitat beweist, war ich gar nicht so verkehrt.
Sehr schön, könnte vielleicht in die FAQ.
MfG.