DC Wiederherstellen
-
Hi @ All.
ich habe ein suppi proggy!
Nur leider beendet sich dies ohne den Bildschirm zu säubern.
wie kann man das ändern.#include <windows.h> #include <math.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HDC dc = GetDC(0); HPEN hPen; HBRUSH hBrush; RECT rClient; double sine; DWORD runtime = 10000; DWORD start = GetTickCount(); DWORD now = start; DWORD tick = 0; GetClientRect(GetDesktopWindow(),&rClient); int x = rClient.left; int y = rClient.top; int width = rClient.right-rClient.left; int height = rClient.bottom-rClient.top; hPen = CreatePen(PS_SOLID,(width > height) ? width : height,RGB(255,255,255)); hBrush = CreateSolidBrush(RGB(0,0,0)); SelectObject(dc,hPen); SelectObject(dc,hBrush); while ((start + runtime >= now) && (now >= start)) { sine = 1 + sin((double)tick/(double)1000); Rectangle(dc,x+sine*width, y+sine*height, x+width-sine*width, y+height-sine*height); now = GetTickCount(); tick = now - start; } return 0; }thx.
EDIT: Wie kann ich den Effekt etwas transparenter gestalten?
Probiert ihn doch mal aus. 10 sekunden warten, wenn er zu ende ist, einfach mal die windows-taste drücken.
-
Also erstmal vorweg: Ausprobieren werde ich das bestimmt nicht...!
Ob das ein "suppi proggy" ist, ist sicherlich Geschmackssache, zumal dieses auch einige Fehler enthält. Ich will Dich allerdings nicht von Deinem Triumpf-Gefühl abbringen
. 'Aufräumen' kannst Du einfach mit einem Funktionsaufruf von InvalidateRect.
-
was enthält das denn für fehler?
danke.
-
das funzt net:
InvalidateRect(GetDesktopWindow(),&rClient,true);thx.
-
Script-Styler schrieb:
was enthält das denn für fehler?
Du musst Deine erstellten GDI-Objekte (nicht zu verwechseln mit Objekten/Instanzen einer Klasse im Sinne der OOP, aber hier ja nicht zutreffend
) auch wieder freigeben bzw. den alten Inhalt des HDC's wieder herstellen.
-
Machs mal so:
InvalidateRect(GetDesktopWindow(), NULL, TRUE); UpdateWindow(GetDesktopWindow());
-
thx thx!
aber ist es auch möglich, die vierecke etwas (50%) transprent zu zeichnen?
thx.
EDIT:
so das ist jetzt mein feddich-quellcode.
aber irgendwie will er hinterher net aufräumen (desktop).#include <windows.h> #include <math.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HDC dc = GetDC(0); HBRUSH hBrush[2]; RECT rClient; double sine; DWORD runtime = 10000; DWORD start = GetTickCount(); DWORD now = start; DWORD tick = 0; GetClientRect(GetDesktopWindow(),&rClient); int x = rClient.left; int y = rClient.top; int width = rClient.right-rClient.left; int height = rClient.bottom-rClient.top; hBrush[0] = CreateSolidBrush(RGB(0,0,0)); hBrush[1] = CreateSolidBrush(RGB(255,0,0)); while ((start + runtime >= now) && (now >= start)) { // Make sine sine = ((double)1 + (double)cos((double)tick/(double)1000))/(double)2; // Draw background SelectObject(dc,hBrush[0]); Rectangle(dc,x, y, x+width, y+height); // Draw foreground SelectObject(dc,hBrush[1]); Rectangle(dc,x+sine*width, y+sine*height, x+width-sine*width, y+height-sine*height); Sleep(1000/25); now = GetTickCount(); tick = now - start; } // Free GDI-Objects for (int i=0;i<2;i++) { DeleteObject(hBrush[i]); hBrush[i] = NULL; } // Update desktop window InvalidateRect(GetDesktopWindow(), NULL, true); UpdateWindow(GetDesktopWindow()); return 0; }
-
nun,
mir kommt die idee, vor her ein neues DC zu erstellen, den desktop dareinzublitten und dann zum schluss wieder in das haupt dc zurückblitten.
wie realisiere ich das?
thx.
-
nene!!!
ich weiß wies geht:InvalidateRect(0, NULL, TRUE); UpdateWindow(GetDesktopWindow());
-
msdn: DeleteObject schrieb:
Do not delete a drawing object (pen or brush) while it is still selected into a DC.