BitBlt funzt net
-
Hi @ All.
ich habe folgenden code verwendet, um für Zehn sekunden das Bild zu blitten.
Das bild wird zuerst in einen kompatiblen dc zwischengespeichert, um es anschließend zurück auf die desktop-dc zu blitten.
das funzt net.
DAS SOLL KEIN ÄRGER_TOOL SEIN, SONDERN SINVOOLL.
ich möchte nähmlich noch wenn es klappt, das bild nicht normal in hCache speichern, sonndern gespiegelt und verschwommen. aber das kommt später.{ DWORD dwMilliseconds = 10000; HDC hDC = GetDC(0); HDC hCache = CreateCompatibleDC(hDC); RECT rect; GetClientRect(GetDesktopWindow(),&rect); BitBlt(hCache, 0,0, rect.right-rect.left,rect.bottom-rect.top, hDC, rect.left,rect.top, SRCCOPY); DWORD dwStart,dwNow; dwStart = dwNow = GetTickCount(); while ((dwNow - dwStart <= dwMilliseconds) && (dwStart <= dwNow)) { BitBlt(hDC, rect.left,rect.top, rect.right-rect.left,rect.bottom-rect.top, hCache, 0,0, SRCCOPY); Beep(440,25); dwNow = GetTickCount(); } DeleteObject(hCache); }was funzt dort net?
thx.
-
In hCache ist keine Bitmap selektiert (bzw. nur die Standard 1x1 große Monochrom-Bitmap ;D)
Dein erstes BitBlt() blittet quasi nirgendswohin...
-
ja aber ich habe ja gar kein bitmap, wo hin ich blitten möchte, sondern ich möchte doch nur ein Desktop-kontext in einem kompatiblen zurücklegen, um ihn später wieder zurückzublitten!
was mache ich denn da?
thx.
-
Ne Bitmap erzeugen und rein-selektieren.
Ein Gerätekontext ist immer mit irgendner Zeichenfläche verbunden.
Entweder direkt mit dem Display (GetDC() liefert z.B. solche) oder mit ner offscreen-Bitmap oder Drucker......CreateCompatibleDC() liefert ein DC mit einer 1x1 große Bitmap zurück.
Erzeug mit CreateCompatibleBitmap() noch ne Bitmap deiner gewünschten Größe und selektier das in hCache mit SelectObject() danach sollte das klappen.
-
so, ich glaube, jetzt ist es korrekt:
{ HDC hDC = GetDC(0); HDC hCache = CreateCompatibleDC(hDC); POINT pMouse; GetCursorPos(&pMouse); RECT rect; GetClientRect(GetDesktopWindow(),&rect); HBITMAP hBitmap = CreateCompatibleBitmap(hDC,rect.right-rect.left,rect.bottom-rect.top); SelectObject(hCache,hBitmap); for (int y = rect.top; y <= rect.bottom; y++) { BitBlt(hCache, 0,rect.bottom-rect.top-y, rect.right-rect.left,1, hDC, rect.left,y, SRCCOPY); } DWORD dwStart,dwNow; dwStart = dwNow = GetTickCount(); while ((dwNow - dwStart <= dwMilliseconds) && (dwStart <= dwNow)) { BitBlt(hDC, rect.left,rect.top, rect.right-rect.left,rect.bottom-rect.top, hCache, 0,0, SRCCOPY); SetCursorPos(pMouse.x,pMouse.y); Sleep(10); dwNow = GetTickCount(); } InvalidateRect(NULL,NULL,TRUE); DeleteObject(hCache); }thx.
-
also ich habe ja immer mit GetClientRect die Dimensionen ermittelt.
aber kann man das nicht anhand des Devicekontext machen?
Danke, dann wäre der Code erheblich sauberer.
thx.
-
DC mit DeleteDC() löschen!
Bitmaps, Pens, Brushes etc. mit DeleteObject.Vor DeleteDC() sollte man rein-selektierte GDI-Objekte wieder raus-selektieren (in dem man das vorherige Objekt wieder rein-sektiert (Rückgabewerte von SelectObject!)