MemoryDC erzeugen



  • Sorry, dass ich schon wieder stören muss, aber ich verzweifle hier gerade!

    Wenn ich mit SetPixel auf ein Fenster zeichne, ist das Bild weg, sobald ich das Fenster minimiere und wieder aufmache.
    Deswegen wollte ich in einen MemoryDC zeichnen und dann während WM_PAINT von da auf das Fenster blitten. Leider bekomme ich es nicht hin.
    Einer meiner Versuche:

    HDC bufferdc;
    bufferdc = CreateCompatibleDC(hdc);
    
    SetDIBitsToDevice (bufferdc,
                                   0,
                                   0,
                                   cxDib,
                                   cyDib,
                                   0,
                                   0,
                                   0,
                                   cyDib,
                                   pBits,
                                   pbmi,
                                   DIB_RGB_COLORS);
    

    Soweit funzt das ganze fehlerfrei. (Vielleicht ist es auch völliger murks...?)

    Wenn ich den DC dann in der BitBlt Funktion angebe, bekomme ich einen Fehler, dass ich ein HDC nicht in ein HWND konvertieren kann:

    hDC = GetDC(hChild);
    hDCbuffer = GetDC(bufferdc);
    
    BitBlt( 
      	hDC, // DC, auf den geblittet werden soll 
      	0,  // x-Start-Position auf dem Ziel-DC 
      	0,  // y-Start-Position auf dem Ziel-DC 
      	200,  // Breite des zu kopierenden (blitten) Bereichs 
      	200, // Höhe des zu blittenden Bereichs 
      	hDCbuffer,  // DC, der auf hdcDest geblittet werden soll (Memory-DC, in den du dein Bild selektiert hast) 
      	0,   // x-Start-Position des zu blittenden Bereichs in hdcSrc 
      	0,   // y-Start-Position des zu blittenden Bereichs in hdcSrc 
      	NULL  // raster operation code, gibt an, wie hdcSrc auf hdcDest geblittet werden soll (genaueres siehe Doku 
    	);
    


  • Also was mich schon wundert, ist, dass du GetDC auf bufferdc aufrufst. Das ist doch schon ein DC.



  • Der Punkte ist ja, dass ich leider keine Ahnung habe, wie das mit dem MemoryDC funktioniert. Der Borland Kommandozeilencompiler kennt dieses ganze Zeug wie CDC und memDC nicht. Kann mir jemand sagen wie ich es richtig mache?



  • Am besten schaust du's dir immer noch in einem fertigen Programm an. So auf die schnelle weiß ich jetzt auch kein Beispiel außer in der VCL mit eingeschaltetem DoubleBuffered.

    Schematisch muss man mit CreateCompatibleDC einen neuen DC erzeugen, in diesen eine mit CreateCompatibleBitmap erzeugte Bitmap selecten (mit SelectObject), dann kann man auf den DC zeichnen (also z.B. dein SetDIBitsToDevice), und dann kannst du das BitBlt machen. Irgendwann danach sollte man natürlich das SelectObject rückgängig machen und Bitmap und DC löschen (DeleteObject bzw. DeleteDC).



  • Das Problem ist, dass ich in google bestimmt schon 10 Beispiele für das Problem gefunden habe, aber jedes benutzt Befehle, die mein Compiler nicht kennt.
    Naja, dann muss ich wohl noch ein bissl selber probieren oder das Problem eventuell anders lösen.
    Auf jeden Fall schon mal danke.


Anmelden zum Antworten