Double Buffering Tutorial



  • Kennt jemand ein gutes Double Buffering Tutorial das auch mit DevC++ 4 funktioniert? Die, die ich bis jetzt gefunden habe waren immer für irgentetwas mit .NET oder so.

    mfg



  • Was genau funktioniert denn nicht? Vielleicht hilft dir auch schon dieser "Basis-Code" von cd9000 🙂



  • flenders schrieb:

    Was genau funktioniert denn nicht? Vielleicht hilft dir auch schon dieser "Basis-Code" von cd9000 🙂

    Cool. Das Beispiel ist ja echt einfach. Das check ich sofort. Mehr brauch ich auch erstmal nicht. DANKE cd9000!!! 🙂



  • DANKE "flenders" 😃

    Ohne dich hätte ich den Beitrag nicht gefunden.



  • Ey momentmal! Der zweite von dein keinBock war ich nicht! Naja: auf jeden Fall:

    HDC hDC = ...; // z.B. mit BeginPaint
    HDC hDC2 = CreateCompatibleDC(hDC);
    HBITMAP hBM = CreateCompatibleBitmap(hDC, cxClient, cyClient);
    SelectObject(hDC2, hBM);

    // Zeichenoperationen auf hDC2...

    BitBlt(hDC, 0, 0, cxClient, cyClient, hDC2, 0, 0, SRCCOPY);
    // Ein SelectObject(OldBitmap); ist imho nicht nötig
    DeleteObject(hBitmap);
    DeleteDC(hDC2);

    Es klappt nicht, ist ja auch ganz klar: Woher soll er cxClient, cyClient oder hBitmap kennen? Da steige ich leider nicht ganz durch ich gebe euche mal den Teil den ich double buffern will:

    void fOptMenu (HWND &hwnd)
    {
     PAINTSTRUCT ps;
     HDC         hDC;
     InvalidateRect(hwnd, NULL, TRUE);
     hDC = BeginPaint(hwnd, &ps);
     {
      TextOut(hDC, 10, 0, "Leicht", 6);
      TextOut(hDC, 10, 20, "Mittel", 6);
      TextOut(hDC, 10, 40, "Schwierig", 9);
      TextOut(hDC, 0, (iSchwierigkeit-1)*20, " ", 1);
      EndPaint(hwnd, &ps);
     }
     InvalidateRect(hwnd, NULL, FALSE);
    }
    

    mfg



  • Ey momentmal! Der zweite von dein keinBock war ich nicht!

    das heißt du willst dich bei flenders nicht bedanken? 😡 😡



  • asdfasdf schrieb:

    Ey momentmal! Der zweite von dein keinBock war ich nicht!

    das heißt du willst dich bei flenders nicht bedanken? 😡 😡

    das hab ich nicht gesagt. Aber jetzt weicht mal nicht vom Thema ab!



  • hBitmap ist ein Vertipper, das soll natürlich hBM heißen. 🙂

    cxClient/cyClient geben einfach die Größe des Zeichenfensters an. Die bekommst du z.B. mit GetClientRect().



  • cd9000 schrieb:

    hBitmap ist ein Vertipper, das soll natürlich hBM heißen. 🙂

    cxClient/cyClient geben einfach die Größe des Zeichenfensters an. Die bekommst du z.B. mit GetClientRect().

    Cool jetzt klappts! Allerdings hab ich noch 2 Probleme:

    1. Wenn ich die Zeichen Aktion nochmal aufrufe, da sich einige positionen ja ändern, ändert sich nichts.
    2. Als Hintergrund hab ich nicht den Hintergrund vom Fenster, sondern einen ganz häßlichen komischen Wirwar...

    edit: problem 1 hat sich erledigt! aber 2 nicht...



  • joomoo schrieb:

    1. Wenn ich die Zeichen Aktion nochmal aufrufe, da sich einige positionen ja ändern, ändert sich nichts.

    Normal, weil Windows ja nicht weiß, dass es etwas zu zeichnen gibt. InvalidateRect und BeginPaint in einer Funktion aufzurufen, ist auch nicht so sinnvoll. BeginPaint darf nur bei WM_PAINT benutzt werden, sonst nicht. Und InvalidateRect verursacht indirekt ein WM_PAINT. Der InvalidateRect-Aufruf bei WM_PAINT dürfte IMHO nicht schaden, bringen wird er aber wenig.

    Du darfst die Zeichenfunktion fOptMenu() also nicht mehrmals, sondern nur einmal bei WM_PAINT aufrufen.

    joomoo schrieb:

    2. Als Hintergrund hab ich nicht den Hintergrund vom Fenster, sondern einen ganz häßlichen komischen Wirwar...

    Auch normal, weil der HDC im Speicher nicht initialisiert wurde. Mach z.B. ein FillRect oder zeichne ein Hintergrundbild, dann ist dieses Wirrwarr weg.


Log in to reply