BitBlt rückgängig
-
Hi,
ich hab bis jetzt ein Programm, mit dem ich per BitBlt() eine Bitmap direkt auf den Desktop male. Wenn man dann mit der maus übere ein Icon auf dem Desktop geht, über dem das bild liegt, wird dieser berech gelöscht, sodass mein bild eine lücke hat. Kann man das verhindern?
Aber was mich viel mehr interessiert: Kann ich diese Bitmap wieder vollständig vom desktop löschen? Bis jetzt schaff ich das nur durch beenden meiner anwendung und drüberschieben eines fensters^^
Vllt kann mir hier jemand helfen?
Mfg
-
Dein "Desktop-Fenster" holst du dir doch sicher mit GetDesktopWindow.
Danach sperrst du das Ding für deine Zwecke mit LockWindowUpdate(hDesktopWindow).
Für die DC des Desktops ist das hier empfehlenswert: hDesktopDC= GetDCEx(hDesktopWindow, NULL, DCX_CACHE|DCX_LOCKWINDOWUPDATE);
Jetzt kannst du wie verrückt blitten.
Am Ende ein LockWindowUpdate(NULL) nicht vergessen!Alternativ kannst du auch ein Fenster ohne Rahmen erstellen und darin din Bild anzeigen. (Wie Windows Mail oder diverse EA Games).
Das Rückgängig machen geht ganz einfach:
Desktop speichern.
In Desktop blitten.
Desktop wiederherstellen.Was genau willst du erreichen?
-
Danke für die schnelle Antwort.
Ich war gestern nicht da, deshalb erst jetzt meine Antwort:
1. Ich habe das LockWindowUpdate das erste mal vor BeginPaint und das zweite mal bei WM_CLOSE. Ist das so richtig? beide bei WM_PAINT führt zu einem stark flackernden bild
2. GetDCEx() funktioniert wunderbar
3. wie speichere ich den desktop? Ich habe es versucht mit:
hdcTempScreen = CreateCompatibleDC(hdcTarget); BitBlt(hdcTempScreen, 0, 0, 200, 200, hdcTarget, 0, 0, 0xCC0020);und dann im WM_CLOSE wieder ein BeginPaint usw. und hdcTaarget und hdcTmpScreen vertauscht. Das ändert aber nichts (hdcTmpScreen hab ich außerhalb der WndProc() definiert.)
4. Was ich noch nicht verstehe:
hdc = BeginPaint(hWnd, &ps); HDC hdcTarget = GetDCEx(hWnd, NULL, DCX_CACHE|DCX_LOCKWINDOWUPDATE);ich verwende bei allen funktionsaufrufen hdcTarget. Was ist das hdc, bzw. wofür brauch ich das?
5. ich will eine Art Startmenü direkt in den Desktop integrieren und ich denke dass ein extra fenster immer zu irgendwelchen problemen führen könnte(hat nicht den fokus, blokiert Desktopfunktion , ...)
Vermutlich mach ich grad alles falsch was man falsch machen kann^^, aber ich kenn mich mit sowas noch nicht wirklich aus

Mfg
DerBaer
-
so, also das rückgängigmachen habe ich jetzt mit InvalidateRect(NULL, rect, true); gelöst.
Jetzt stellt sich mri nur noch die Frage, was mit 1. und 3. ist^^