ein double buffering problem



  • Hallo Leute,

    Ich habe ein kleines problem mit dem double buffering, dass Bild flickert immer, Ich hoffe das ihr mirr helfen konnt, Danke.
    Hier ist der source code:

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
                                HDC hdc, hdcMem;
                                HBITMAP hbmpBackground, hbmpSlika, hbmpMemStari, hBM;
                                PAINTSTRUCT ps;
                                BITMAP bitmap;
                                static int poz=250,pol=2,obll=1,obld=1;
    
    switch (message)
    {
    case WM_CREATE:
    
                                SetTimer (hwnd, ID_TIMER, 80, NULL) ;
                                char xy[3];
    return 0 ;
    
    case WM_TIMER :
    
    if(poz>450)pol=1;
    
                                else if(poz<5)pol=2;
                                InvalidateRect (hwnd, NULL, TRUE) ;
    return 0 ;
    
    case WM_PAINT:
                                hdc = BeginPaint(hwnd, &ps);
                                hdcMem = CreateCompatibleDC(hdc);
                                hBM = CreateCompatibleBitmap(hdc, 500, 200);
                                SelectObject(hdcMem, hBM);
                                hbmpBackground = (HBITMAP)LoadImage(NULL, "slike/background.bmp",
                                IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
                                SelectObject(hdcMem, hbmpBackground);
                                BitBlt(hdc, 0, 0, 500, 200, hdcMem, 0, 0, SRCCOPY);
    
    if(pol==2){
    
        switch (obld){
    
                case 1:         hBM = CreateCompatibleBitmap(hdc, 43, 42);
                                SelectObject(hdcMem, hBM);
                                hbmpSlika = (HBITMAP)LoadImage(NULL, "slike/cream1D.bmp",
                                IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
                                SelectObject(hdcMem, hbmpSlika);
                                obld+=1;
                break;
    
                        case 2: hBM = CreateCompatibleBitmap(hdc, 43, 42);
                                SelectObject(hdcMem, hBM);
                                hbmpSlika = (HBITMAP)LoadImage(NULL, "slike/cream2D.bmp",
                                IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
                                SelectObject(hdcMem, hbmpSlika);
                                obld+=1;
            break;
    
                        case 3: hBM = CreateCompatibleBitmap(hdc, 43, 42);
                                SelectObject(hdcMem, hBM);
                                hbmpSlika = (HBITMAP)LoadImage(NULL, "slike/cream3D.bmp",
                                IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
                                SelectObject(hdcMem, hbmpSlika);
                                obld=1;
            break;
    
    }
                                itoa(poz,xy,10);
                                BitBlt(hdc, poz, 125, 43, 42, hdcMem, 0, 0, SRCCOPY);
                                TextOut(hdc, poz+10, 90,xy,strlen(xy));
                                poz+=5;
                                }
    else if(pol==1){
    
        switch (obll){
    
                        case 1: hBM = CreateCompatibleBitmap(hdc, 43, 42);
                                SelectObject(hdcMem, hBM);
                                hbmpSlika = (HBITMAP)LoadImage(NULL, "slike/cream1L.bmp",
                                IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
                                SelectObject(hdcMem, hbmpSlika);
                                obll+=1;
            break;
    
                        case 2: hBM = CreateCompatibleBitmap(hdc, 43, 42);
                                SelectObject(hdcMem, hBM);
                                hbmpSlika = (HBITMAP)LoadImage(NULL, "slike/cream2L.bmp",
                                IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
                                SelectObject(hdcMem, hbmpSlika);
                                obll+=1;
            break;
    
                        case 3: hBM = CreateCompatibleBitmap(hdc, 43, 42);
                                SelectObject(hdcMem, hBM);
                                hbmpSlika = (HBITMAP)LoadImage(NULL, "slike/cream3L.bmp",
                                IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
                                SelectObject(hdcMem, hbmpSlika);
                                obll=1;
            break;
    
    }
                                itoa(poz,xy,10);
                                BitBlt(hdc, poz, 125, 43, 42, hdcMem, 0, 0, SRCCOPY);
                                TextOut(hdc, poz+10, 90,xy,strlen(xy));
                                poz-=5;
                                }
                                DeleteObject(hbmpSlika);
                                DeleteObject(hBM);
                                DeleteDC(hdcMem);
                                EndPaint(hwnd, &ps);
    return 0;
    
    case WM_DESTROY:
                                PostQuitMessage (0) ;
    return 0 ;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    


  • benutze cpp tags, so hat keiner lust sich den Code anzutun



  • vlad_tepesch schrieb:

    benutze cpp tags, so hat keiner lust sich den Code anzutun

    Dass wurde gehrne aber ich muss es in c schreiben



  • zero_cool schrieb:

    vlad_tepesch schrieb:

    benutze cpp tags, so hat keiner lust sich den Code anzutun

    Dass wurde gehrne aber ich muss es in c schreiben

    Hallo,

    Du initialisierst, wenn es nicht soweit ist, wie hier:

    HDC hdc, hdcMem; // <---
    HBITMAP hbmpBackground, hbmpSlika, hbmpMemStari, hBM; // <----
    PAINTSTRUCT ps;
    BITMAP bitmap;
    static int poz=250,pol=2,obll=1,obld=1; // <---

    im Kopf der Callpack-Routine.

    Das gehört da nicht hin.
    Deine Mem-GDI-Platform CompatibleBitmap definierst eh immer gleich, warum
    legst Du die nicht von Beginn an als Blackmap ab?

    Beginne in WM_PAINT mit
    BeginPaint( ... )
    ... Anweisungen
    EndPaint( ... )

    Innerhalb von BeginPaint zu EndPaint, darin solltest Du klar zuweisen.

    Innerhalb des Callbacks etwas von File zu laden ist absolut nicht drin! Lade es vorher! Besser stelle es in die Resource. Das kostet Zeit viel Zeit.



  • zero_cool schrieb:

    vlad_tepesch schrieb:

    benutze cpp tags, so hat keiner lust sich den Code anzutun

    Dass wurde gehrne aber ich muss es in c schreiben

    ROFL

    Die cpp-Tags führen lediglich zur Darstellung deines Codes mit Syntaxhighlighting. Tus einfach...

    cheers, Swordfish



  • hier ich habs getan

    sorry fur die rechtzschreibung, bin etwas eingerosstet



  • hier ich habs getan

    sorry fur die rechtzschreibung, bin etwas eingerosstet



  • Swordfish schrieb:

    zero_cool schrieb:

    vlad_tepesch schrieb:

    benutze cpp tags, so hat keiner lust sich den Code anzutun

    Dass wurde gehrne aber ich muss es in c schreiben

    ROFL

    Die cpp-Tags führen lediglich zur Darstellung deines Codes mit Syntaxhighlighting. Tus einfach...

    cheers, Swordfish

    ok ich habs getan



  • [quote="CStern"][quote="zero_cool"]

    vlad_tepesch schrieb:

    benutze cpp tags, so hat keiner lust sich den Code anzutun

    Kannst du etwas genauer werrden


Anmelden zum Antworten