DC anzeigen



  • Ich habe in WM_CREATE meines Fensters mit

    hdcScreenBuffer = CreateCompatibleDC( GetDC(hWnd) );
    

    einen DC im Speicher erzeugt. In diesen rendere ich nun einige JPEGs. (Hintergrundbild + Bilder für Buttons (die ich als transparente Fenster gemacht habe). Ich habe nur leider keine Idee, wie ich den DC jetzt angezeigt bekommen kann. Ich denk mal dass ich da irgendwas in WM_PAINT einfügen muss. Aber was?



  • Einfach mit BitBlt auf den Screen kopieren.



  • Irgendwie bekomm ich das nicht hin. Ich hab jetzt mal Testweise folgendes in WM_PAINT reingeschrieben:

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hDC;
    
        hDC = BeginPaint(hWnd, &ps);
    
        RECT Screen;
    
        GetClientRect(hWnd, &Screen);
    
        HDC hdcScreenBuffer = CreateCompatibleDC( hDC );
    
        SetBkMode(hdcScreenBuffer, TRANSPARENT);
        SetTextColor(hdcScreenBuffer, RGB(0, 191, 255));
        TextOut(hdcScreenBuffer, 0, 0, "PictureBox", 10);
    
        Rectangle (hdcScreenBuffer, 100, 100, 500, 500);
    
        BitBlt(hDC, Screen.left, Screen.top, Screen.right, Screen.bottom, hdcScreenBuffer, 0, 0, SRCCOPY);
    
        EndPaint(hWnd, &ps);
    
        return 0;
    }
    

    Compilieren und ausführen klappt zwar ohne Fehler, aber von Text und Rechteck seh ich nichts.

    [ Dieser Beitrag wurde am 30.07.2002 um 18:11 Uhr von flenders editiert. ]



  • Leg' im Speicher-DC erst eine Bitmap an, die genau so groß ist, wie dein Fenster (mit CreateBitmap() und SelectObject()). Diese Bitmap ist dann praktisch deine Leinwand, auf die du malen kannst. Nachher kannst du diese Bitmap auf den Screen blitten.
    Ach ja, und den Speicher-DC musst du noch mit DeleteDC() wieder freigeben.

    Beispiel:

    case WM_PAINT:
        HDC hdc, hdcScreenBuffer;
        PAINTSTRUCT ps;
        RECT rcClient;
        HBITMAP hBitmap, hBmpOld;
        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...
        TextOut(blblabla...);
    
        // Und ab auf den Screen:
        BitBlt(hdc,0,0,rcClient.right,rcClient.bottom,hdcScreenBuffer,0,0,SRCCOPY);
    
        DeleteObject(SelectObject(hdcScreenBuffer,hBmpOld));
        DeleteObject(hBrWhite);
        DeleteDC(hdcScreenBuffer);
    
        EndPaint(hwnd,&ps);
        return 0;
    

    [ Dieser Beitrag wurde am 30.07.2002 um 18:52 Uhr von macphistox2002 editiert. ]



  • Funktioniert. Danke nochmals.



  • Guten Abend allerseits,
    bei mir will es nicht funktionieren(windows 98/visual studio 5).
    Ergänze ich im Beispiel zu TextOut(hdcScreenBuffer,0,0,"amoasch",7) sollte sich
    doch für normal was zeigen, oder? Wenn ich statt eines mit CreateBitmap erzeugten HBITMAP ein mit LoadBitmap initialisiertes nehme, klappts wunderbar.
    hmm, seltsam. Vielleicht weiss ja wer was.

    m.f.G
    Pablo



  • zeig mal den Code 🙄



  • hola flenders,
    ich hab' den Code von macphiostox gecopy- und pastet und die TextOut(blabla)-Zeile durch TextOut(hdcScreenBuffer,0,0,"amoasch",7) ersetzt. Ansonsten gibt's im Code nur noch 'n WM_DESTROY und die WinMain-Funktion.

    Pablo



  • Nimm anstelle von CreateBitmap das hier:

    CreateCompatibleBitmap(hdc,rcClient.right, rcClient.bottom);
    


  • 👍 🙂 👍
    jepp, geht.
    thanks a lot

    Pablo


Log in to reply