Neuzeichnen vieler Bitmaps



  • Sorry, aber du musst den Backbuffer auf den HDC deines Fensters malen. Wenn das nicht geht, kann ich dir nicht helfen.



  • myBufferhdc = mein Backbuffer
    Bildhdc = Frontbuffer.



  • Wo blittest du denn die Hintergrundgrafik ?
    (oder ist das etwa HBMP_Buffer ? - Falls ja dann zeichnest du auf das Hintergrundbild, was du aber gar nichts willst ;D)



  • Eben, ich weiß nämlich nicht wie. Aber eine kleine Codezeile wäre ja deshalb nicht schlecht. Wenn ich wüsste, wie ich ein Buffer splitte, in den ich später was reinzeichne, dann hätte ich womöglich auch nicht dieses Problem. Vielleicht könnte mir ja mal jemand eine Codezeile vorgeben.
    Das ist eben dieser kleine Ruck, den ich brauche.



  • Falls du noch Probleme mit DoubleBuffering ansich hast: http://c-plusplus.net/forum/viewtopic.php?t=14713



  • Kann man eigentlich in einen HDC zeichnen, in den man vorher nichts reiselektiert hat? Also

    HDC IrgendeinHDC, superHDC;

    ...
    IrgendeinHDC = CreateCombatibleBitmap(superHDC);
    BitBlt(IrgendeinHDC, 0, 0, 100, 100, usw. ...);
    ...



  • Alsoo MOOOOOOOOOOOMENT

    Jetzt komm ich mir veralbert vor.
    Was ist denn der Unterschied zwischen dem Code, den ich ganz am Anfang gepostet habe und dem Link von flenders.



  • z.B. hast du nirgends CreateCompatibleBitmap stehen 🙄



  • Vorgehensweise wäre diese:

    Backbuffer erzeugen:
    o Mit CreateCompatibleDC() quasi die 1. 'Leinwand-Halterung' holen
    o Mit CreateCompatibleBitmap() quasi 'Papier' für die 1. Leinwand-Halterung holen
    o Mit SelectObject() das 'Papier' in die 1. 'Leinwand-Halterung einsetzen' und das alte 'Papier' das vorher drin war am besten irgendwohin legen...

    Hintergrundbild zeichnen:
    o Mit CreateCompatibleDC() noch eine 'Leinwand-Halterung' holen
    o Ein fertiges Bild ('Papier' ;D) mit LoadBitmap(), LoadImage() oder sonstwas holen
    o Mit SelectObject() das fertige 'Bild' in die 2. 'Leinwand-Halterung' einsetzen und wieder das was vorher drin war irgendwie sichern
    o Jetzt einen Spezialisten holen, der geniale 1:1 Kopien hinkriegt: Mit BitBlt() das Bild in der 2. Leinwandhalterung auf das Bild in der 1. Leinwandhalterung kopieren lassen

    Kugel zeichnen:
    o Mit CreateCompatibleDC() eine 3. 'Leinwand-Halterung' holen
    o Das fertiges Bild ('Papier' ;D) mit der Kugel via LoadBitmap(), LoadImage() oder sonstwas holen
    o Mit SelectObject() das fertige 'Bild' in die 3. 'Leinwand-Halterung' einsetzen und wieder das was vorher drin war irgendwie sichern
    o Jetzt einen Spezialisten holen, der geniale 1:1 Kopien mit Transparenz hinkriegt: Mit TransparentBlt() das Bild in der 2. Leinwandhalterung auf das Bild in der 1. Leinwandhalterung kopieren lassen

    Das ganze darstellen:
    o Auf dem Papier in der 1. Leinwand ist jetzt das komplette Bild drin
    o Mit BitBlt() jetzt einfach eine 1:1 Kopie auf das Bild in der Leinwand des Fenster machen (BeginPaint() liefert uns ja die 'Leinwand' ;D)

    ...und aufräumen - jeweils für alle 3 erzeugten Leinwände:
    o Das Papier aus der Leinwandhalterung nehmen und das was vorher drin war wieder reinpacken (SelectObject())
    o Mit DeleteDC() die Leinwandhalterung wieder weg in den Keller packen
    o Mit DeleteObject() das voll-bemalte Papier (das mit CreateCompatibleBitmap() erzeugt) in die Mülltonne schmeißen.

    ------
    Das soll jetzt nur das Prinzip darstellen 😉
    Wenn man das ganze öfter zeichnet macht es natürlich keinen Sinn die Bilder jedesmal neu zu laden und die DCs und die Bitmap im Backbuffer-DC ständig zu erzeugen und dann wieder freizugeben.
    Stattdessen wird man die Bilder und den Backbuffer einmal bei WM_CREATE erzeugen/laden und bei WM_DESTROY freigeben. Den Backbuffer müsste man höchstens bei WM_SIZE in der Größe jeweils anpassen...



  • Wow, Danke Leute.

    Endlich mal ein Ablaufplan, womit ich was Anfangen kann.



  • echt EDEL, geeky!
    -> faq?



  • geeky schrieb:

    Stattdessen wird man die Bilder und den Backbuffer einmal bei WM_CREATE erzeugen/laden und bei WM_DESTROY freigeben. Den Backbuffer müsste man höchstens bei WM_SIZE in der Größe jeweils anpassen...

    bei WM_CREATE funktioniert

    HDC hdcBack = CreateCompatibleDC(hcd);
    

    ja noch nicht, weil hdc = BeginPaint()ist, also erst in WM_PAINT erstellt wird.

    wie erstellt man also den backBuffer?



  • CreateCompatibleDC(NULL);
    ...damit erzeugst du einen DC der zum Desktop-DC kompatibel ist 😉
    (oder via GetDC() einfach das Fenster-DC holen...)


Anmelden zum Antworten