Screenshot auf das Fenster zeichnen



  • Hallo,

    ich hab folgenden Code um einen Screenshot auf das Fenster zu zeichnen:
    ➡ WM_COMMAND

    ...
    SourceDC = GetWindowDC(hwnd);
    DestDC = CreateCompatibleDC(SourceDC);
    hBitmap = CreateCompatibleBitmap (SourceDC, 100, 100);
    SelectObject(DestDC, hBitmap);
    BitBlt(DestDC,0,0,100,100,SourceDC,0,0,SRCCOPY); 
    DeleteDC(SourceDC);                    
    DeleteDC(DestDC);
    ...
    

    ➡ WM_PAINT

    ...
    hdcMem = CreateCompatibleDC (hdc) ; 
    SelectObject (hdcMem, hBitmap) ; 
    BitBlt (hdc, 100, 100, 100, 100, hdcMem, 0, 0, SRCCOPY) ;
    ...
    

    Ich will es so in einem Bitmap speichern, da wenn ich es ja in WM_COMMAND direkt zeichnen würde, bei einem Aufruf von WM_SIZE bzw. WM_PAINT verschwinden würde.

    Das Problem an meinem Code ist, dass nichts nach einem Klick auf den Button gezeichnet wird. Wenn ich das ganze ohne Bitmap und in WM_COMMAND direkt mache geht es, bloß beim Neuzeichnen verschwindet es.

    Wie kann ich es am besten in WM_COMMAND zwischenspeichern und dann bei WM_PAINT zeichnen? Und was mache ich bei dem obigen Code falsch?

    MfG, Michael



  • Hallo,
    eine Vermutung von mir (bin aber selbst mit C/C++ erst ganz am Anfang und am rumprobieren):
    Wenn du die Daten des Bitmap zwischenspeichern willst, musst du so weit ich weiß
    die Deklaration statisch machen:

    static HBTIMAP hBitmap;
    

    Das muss soweit ich weiß sein, da beide WindowMessages in einem eigenen Funktionsaufruf passieren (wird ja auch ein anderer switch-case durchlaufen). Wenn das Bitmap nicht static ist, wird es beim ersten Aufruf (WM_COMMAND) erzeugt und ist innerhalb des WM_COMMAND-Kontext vorhanden.
    Beim Aufruf mit der nächsten WindowMessage (WM_PAINT) wird ohne "static"eine neue (leere, ggf. sogar uninitialisierte) HBITMAP-Strukter im Speicher angelegt, die logischerweise auf jeden Fall nicht den Screenshot enthält.
    (das static erweitert die Lebensdauer der Variablen, so dass diese bis zum Programmende existiert und der Wert auch bei erneutem Funktionsaufruf erhalten bleibt)

    Gruß


Anmelden zum Antworten