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.


Anmelden zum Antworten