GDI: fenster im hintergrund und wieder im vordergrund und die zeichnungen sind weg



  • Du könntest einfach alle deine Zeichenoperationen in einem Backbuffer durchführen und in WM_PAINT diesen einfach immer auf (in?) den DC blitten!
    Wie es geht? -> Forensuche



  • Danke erstmal für die vorschläge.
    Das mit dem speichern wird wohl so nicht gehn (bei mir) da in meinem Fenster viel bewegung ist.
    Das mit en Backbuffer hört sich kompliziert an aber mal schauen.

    Dumme frage aber es würde ja reichen wenn ich die zeichnungs-operationen in die WM_PAINT bekomme?



  • Eigentlich schon. Weil meines Wissens wird WM_PAINT aufgerufen, wenn das Fenster oder Teile davon neu gezeichnet werden müssen. Das ist ja auch der Fall, wenn das Fenster durch ein anderes überdeckt wird.

    cya



  • Original erstellt von Lawilog:
    **
    ...
    wenn das fenster den focus verliert, wird der fenster-inhalt gespeichert und wenn es dann den focus wieder bekommt, wird der inhalt des speichers wieder auf das fenster gemalt. ich habs damals mit SaveDC() / RestoreDC() probiert. auch die positionen aller karten zu speichern kam mir schon in den sinn.
    ...
    **

    hab ich grad(vorhin) auch getestet aber es scheint nicht zu funktionieren..

    und mit dem backbuffer entweder bin ich zu dumm oder es geht auch nicht hatt denn niemand ne idee oder ein stück funktionierenen quellcode?



  • Benutz doch einfach die Forensuche, da findest du Quellcode (Stichwort: CreateCompatibleDC)



  • die suche hab ich benutzt und auch deinen Beitrag (flenders) gefunden Und andere.

    nur ich kann die WM_PAINT nicht benutzen da dann meine ganze anwendung nicht mehr funktioniert.

    mein problem is das ich nichtweiß in welche WM_* ich das bitblt() setzten soll.
    bzw. was passiert wenn das fenster den focus verliert oder in de z-order runter rutscht.



  • Ok nun hab ich es schon fast hinbekommen.



  • *tüftel* ICH KANN DIE WM_PAINT (noch?!) nicht benutzten da meine anwendung dadurch nicht funktioniert.

    also bringt Backbuffering nichts!



  • Original erstellt von flenders:
    Du könntest einfach alle deine Zeichenoperationen in einem Backbuffer durchführen und in WM_PAINT diesen einfach immer auf (in?) den DC blitten!
    Wie es geht? -> Forensuche

    geht auch garnicht.

    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
    
    switch (iMsg)
    {
    case WM_CREATE:
        static HDC hdc, hdcScreenBuffer;
       static  PAINTSTRUCT ps;
        static RECT rcClient;
       static    HBITMAP hBitmap, hBmpOld;
        static HBRUSH hBrWhite;
    
        hdc = BeginPaint(hwnd,&ps);
        hdcScreenBuffer = CreateCompatibleDC(hdc);
    
        GetClientRect(hwnd,&rcClient);
    
        hBitmap = CreateBitmap(rcClient.right, rcClient.bottom,1,8,NULL);
        hBmpOld = (HBITMAP) SelectObject(hdcScreenBuffer,hBitmap);
        hBrWhite = CreateSolidBrush(RGB(255,255,255));
        FillRect(hdcScreenBuffer,&rcClient,hBrWhite);
    
        // Jetzt kannst du irgendwas malen...
        Rectangle(hdc,10,10,100,100);
    
        // Und ab auf den Screen:   
        return 0;
    
    case WM_PAINT:  
        BitBlt(hdc,0,0,rcClient.right,rcClient.bottom,hdcScreenBuffer,0,0,SRCCOPY);
        return 0;
    
    case WM_DESTROY:
    
        DeleteObject(SelectObject(hdcScreenBuffer,hBmpOld));
        DeleteObject(hBrWhite);
        DeleteDC(hdcScreenBuffer);
        EndPaint(hwnd,&ps);   
        PostQuitMessage(0);
        return 0;
    
    }
     return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
    


  • Backbuffer geht nur wenn ALLES in der WM_PAINT ist
    und dort kann ich es in meinem fall auch gleich wegglassen.



  • LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
    static HDC hdcScreenBuffer;
    static RECT rcClient;
    
    switch (iMsg)
    {
    case WM_CREATE:
        HDC hdc = GetDC(hwnd);
        SelectObject(hdcScreenBuffer, CreateCompatibleBitmap(hdc) );
        GetClientRect(hwnd,&rcClient);
        FillRect(hdcScreenBuffer,&rcClient,(HBRUSH)GetStockObject(WHITE_BRUSH) );
        ReleaseDC(hdc);
        return 0;
    
    case WM_PAINT:  
        PAINTSTRUCT ps; 
        HDC hdc = BeginPaint(hwnd, &ps);
        BitBlt(hdc,0,0,rcClient.right,rcClient.bottom,hdcScreenBuffer,0,0,SRCCOPY);
        EndPaint(hwnd, &ps); 
        return 0; 
    
    case WM_DESTROY:
        DeleteDC(hdcScreenBuffer);
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
    

    Jetzt solltest du von irgendwo aus WndProc heraus direkt in hdcScreenBuffer zeichnen können, also ohne GetDC, BeginPaint oder so!
    Ich habe den Code nicht ausprobiert, aber so ungefähr sollte es aussehen. 🙄

    [edit]Ich hab WM_PAINT nochmal korrigiert, das hatte ich nen Fehler drin![/edit]

    [ Dieser Beitrag wurde am 28.12.2002 um 12:26 Uhr von flenders editiert. ]


Anmelden zum Antworten