CDC & Co. machen Probleme
-
Hallo!
Es ist wohl das beste, ich kopiere den betreffenden Codeblock einfach rein:CDC dc; HDC hdc; CDC memDC; CBitmap bm; CRect r; GetWindowRect(::GetDesktopWindow(), &r); hdc = GetWindowDC(::GetDesktopWindow()); dc.Attach(hdc); memDC.CreateCompatibleDC(&dc); CSize sz(r.Width(), r.Height()); bm.CreateCompatibleBitmap(&dc, 640, 480); CBitmap * oldbm = memDC.SelectObject(&bm); memDC.StretchBlt(0, 0, 640, 480, &dc, 0, 0, sz.cx, sz.cy, SRCCOPY); SaveBitmapToFile(bm, bmpPath); memDC.SelectObject(oldbm); bm.Detach(); dc.Detach(); dc.DeleteDC(); bm.DeleteObject(); memDC.DeleteDC(); DeleteObject(hdc);
Der Code macht einfach einen Screenshot und speichert ihn über SaveBitmapToFile in eine Datei. Das Problem ist, dass das ganze (fast)unendlich lange in einer Schleife laufen soll. Nach ~100 (oder auch weniger) Durchläufen geht aber nichts mehr. Ich habe das Problem schon einmal gehabt und da ist es an den DCs gelegen, die ich nicht ordentlich wieder gelöscht hatte, aber in dem obigen Ausschnitt wird doch mehr als genug herumgelöscht!
Was kann ich da tun?
maTTYhias
-
Ich würde nur den Code zum Speichern in die Schleife packen, den Rest irgendwo im Konstruktor oder so machen ...
-
ist vielleicht nach ein paar mal deine festplatte voll? bitmaps sind ganz schön groß
-
ich habe bereits nur diesen Teil
GetWindowRect(::GetDesktopWindow(), &r); hdc = GetWindowDC(::GetDesktopWindow()); dc.Attach(hdc); memDC.CreateCompatibleDC(&dc); CSize sz(r.Width(), r.Height()); bm.CreateCompatibleBitmap(&dc, 640, 480); CBitmap * oldbm = memDC.SelectObject(&bm); memDC.StretchBlt(0, 0, 640, 480, &dc, 0, 0, sz.cx, sz.cy, SRCCOPY); SaveBitmapToFile(bm, bmpPath); memDC.SelectObject(oldbm); bm.Detach(); dc.Detach();
in der Schleife und den Rest vor bzw. danach gelassen. Es ändert sich aber überhaupt nichts...
Hat sonst noch jemand eine Idee...?
-
-Ein kurzer Blick in die MSDn über den Befehl GetWindowDC würde zum Vorschein bringen, dass dieser mit ReleaseDC freizugeben ist, nicht mit DeleteDC!
- Ein Bitmap, welches erstellt und danach nicht wieder gelöscht wird, bleibt im Speicher!2. Wir sind hier in der MFC, da macht man das ganze folgendermassen:
CWindowDC dc( NULL); CRect r; CWnd::GetDesktopWindow()->GetWindowRect( r); CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap bm; bm.CreateCompatibleBitmap( &dc, 640, 480); CBitmap * oldbm = memDC.SelectObject(&bm); memDC.StretchBlt(0, 0, 640, 480, &dc, 0, 0, r.Width(), r.Height(), SRCCOPY); memDC.SelectObject(oldbm); SaveBitmapToFile(bm, bmpPath);
[ Dieser Beitrag wurde am 10.02.2003 um 08:53 Uhr von RenéG editiert. ]