Grafikausgabe ohne Flackern
-
An volkard:
Es gibt überhaupt kein CMemoryDC. Ist das irgend so eine Klasse, die jemand privat geschrieben hat? Wenn ich sowas wollte, könnte ich auch die GDI Grafik Lib nehmen. Ich will das aber selbst programmieren und deshalb brauche ich nur ganz allgemein den Lösungsweg und nicht etwas Vorgefertigtes, wo ich einfach nur eine Funktion aufrufe.
Und der Link bezieht sich nicht auf die MFC.An sufu:
Das ist immer Eure Standardantwort, was? Meinst Du, ich hätte nicht bereits in Google gesucht und meinst Du, daß mir Deine Antwort jetzt großartig weitergeholfen hat? Vielleicht hab ich bisher die falschen Begriffe eingegeben. Hättest Du Dir wenigstens die Mühe gemacht, mir einen Link zu einer Seite zu schicken, die sowas behandelt. Oder die genauen Stichworte, mit denen ich bei Google in jedem Fall auf den ersten drei Seiten das finde, was ich suche. Aber einfach nur den Begriff Google als Antwort geben ist für mich Klugscheißerei. Was erwartest Du eigentlich, wenn Du sowas schreibst? Erwartest Du, daß man Dir sagt "Ja, toll, danke! Mit Deiner Möglichkeit hab ich tatsächlich gefunden, was ich suche. Nochmal vielen Dank für den super Tip"? Das wäre ungefähr so, als würde man mich in einem christlichen Forum fragen, was Sünde ist und ich würde antworten: "Steht in der Bibel." Also, wenn Du das nächte Mal nichts weiter zu bieten hast als das Wort Google, wieso siehst Du dann nicht einfach davon ab, überhaupt eine Antwort zu geben?
-
Google ist die einzig vernünftige Antwort auf so eine Frage weil sie so häufig gestellt wird und natürlich auch beantwortet wird.
-
NES-Spieler schrieb:
An volkard:
Es gibt überhaupt kein CMemoryDC. Ist das irgend so eine Klasse, die jemand privat geschrieben hat?kann schon sein. ist mir gar nicht aufgefallen. irgendwie nimmt man immer CMemoryDC. kann nur daran liegen, daß die klasse so klein ist, daß man sie sich auch selber macht, wenn man sie nicht findet.
aber die macht auch nix anderes, als den kram auf http://www.catch22.net/tuts/flicker.asp
nur halt das inistialisieren im konstruktor und das malen und löschen um destruktor. das ist dann ganz praktisch, wenn man es öfter mal raucht.hier ne CMemDC
http://www.codeproject.com/gdi/flickerfree.asp
-
Google ist die einzig vernünftige Antwort auf so eine Frage weil sie so häufig gestellt wird und natürlich auch beantwortet wird.
Ach ja? O.k., Klugscheisser! Dann sag mir doch mal: Wenn die Frage so häufig gestellt und auch beantwortet wird, wieso nennt Ihr dann noch immer Google als Antwort, statt einen Link auf das entsprechende Thema im Forum anzugeben?
-
Weil das anstrengender für uns wäre immer den Link rauszusuchen.
-
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.