Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Yksinkertainen näytönsäästäjä

Sivun loppuun

Seppänen Sami [14.10.2002 17:51:42]

#

Eli tässä on koodi yksinkertaiseen "näytönsäästäjään". ja tottakait mukana on myös yksi pienehkö bugikin, eli koodi ei missään vaiheessa tarkasta lähteekö viiva menemään ikkunassa vaaka- tai pystysuunnassa kohtisuoraan. Tämän tapahtuessa ei lopputulos ole visuaalisesti toivottu, mutta kuitenkin asianmukaisesti toimiva.

//Yksinkertainen näytönsäästäjä

// INCLUDET ///////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN

#include <windows.h>   // windowsin otsikkotiedostot
#include <stdlib.h>

// VAKIOT ////////////////////////////////////////////////


#define WINDOW_CLASS_NAME "WINCLASS"

#define WINDOW_WIDTH  800
#define WINDOW_HEIGHT 600

// MAKROT /////////////////////////////////////////////////

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)

// GLOBAALIT ////////////////////////////////////////////////
HWND      main_window_handle = NULL; // Ikkunan kahvaa varten

HINSTANCE hinstance_app      = NULL; // ikkunan ilmentymää varten


// FUNCTIOT //////////////////////////////////////////////
//ikkunan päävisestin käsittelijä
LRESULT CALLBACK WindowProc(HWND hwnd,
						    UINT msg,
                            WPARAM wparam,
                            LPARAM lparam)
{
PAINTSTRUCT		ps;		// WM_PAINT käyttää
HDC			hdc;		// kahva laitteeseen


// tarkastetaan viesti
switch(msg)
	{
	case WM_CREATE:
        {
		return(0);
	} break;

	case WM_PAINT:
	{
	// valitaan maalattavaksi koko ikkuna
   	hdc = BeginPaint(hwnd,&ps);

        // lopetetaan maalaaminen
        EndPaint(hwnd,&ps);

        // palataan onnistuneesti
	return(0);
	} break;

	case WM_DESTROY:
		{

		// Lähetetään WM_QUIT viesti viesti jonoon
		PostQuitMessage(0);

        // Palataan onnistuneesti
		return(0);
		} break;

	default:break;

    } // end switch

// Lähetetään kaikki loput viestit windowsille...
return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc

// WINMAIN ////////////////////////////////////////////////
int WINAPI WinMain(	HINSTANCE hinstance,
					HINSTANCE hprevinstance,
					LPSTR lpcmdline,
					int ncmdshow)
{

WNDCLASSEX winclass; 		  // ikkunaluokkaa varten
HWND	   hwnd;		  // ikkunan kahva
MSG		   msg;		  // viestille
HDC        hdc;      	   	  // piirto "laite"

HPEN       pen=NULL; 		 // tällä kynällä piirretään viivat
HPEN	   e_pen=NULL;		// tällä kynällä pyyhitään viivat
int color_change = 50;		 // värin vaihtoa varten

// täytetään ikkuna structuurista tarvittavat kohdat
winclass.cbSize         = sizeof(WNDCLASSEX);
winclass.style			= CS_DBLCLKS | CS_OWNDC |
                          CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc	= WindowProc;
winclass.cbClsExtra		= 0;
winclass.cbWndExtra		= 0;
winclass.hInstance		= hinstance;
winclass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor		= LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName	= NULL;
winclass.lpszClassName	= WINDOW_CLASS_NAME;
winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

// tallennetaan ikkunan ilmentymä globaaliksi
hinstance_app = hinstance;

// rekisteröidään ikkuna windowsiin
if (!RegisterClassEx(&winclass))
	return(0);

// Luodaan ikkuna
if (!(hwnd = CreateWindowEx(NULL,
                            WINDOW_CLASS_NAME,
			   "Yksinkertainen 'näytönsäästäjä'",
			    WS_OVERLAPPEDWINDOW | WS_VISIBLE,
			    0,0,
			    WINDOW_WIDTH,
                            WINDOW_HEIGHT,
			    NULL,
			    NULL,
			    hinstance,
			    NULL)))
return(0);

// tallennetaan ikkunan kahva globaaliksi
main_window_handle = hwnd;

//haetaan DC
hdc = GetDC(hwnd);

// otetaan rand:lle satunnais luku siemen
srand(GetTickCount());

// asetetaan viivojen päätepisteet
int x1 = rand()%WINDOW_WIDTH-10;
int y1 = rand()%WINDOW_HEIGHT-30;
int x2 = rand()%WINDOW_WIDTH-10;
int y2 = rand()%WINDOW_HEIGHT-30;
int x3 = rand()%WINDOW_WIDTH-10;
int y3 = rand()%WINDOW_HEIGHT-30;
int x4 = rand()%WINDOW_WIDTH-10;
int y4 = rand()%WINDOW_HEIGHT-30;

// asetetaan nopeudet
int x1v = 1 + rand()%8;
int y1v = 1 + rand()%8;
int x2v = 1 + rand()%8;
int y2v = 1 + rand()%8;
int x3v = 1 + rand()%8;
int y3v = 1 + rand()%8;
int x4v = 1 + rand()%8;
int y4v = 1 + rand()%8;


//luodaan puyyhintä kynä
e_pen = CreatePen(PS_SOLID,1,RGB(0,0,0));

//ohjelman päälooppi
while(TRUE)
	{
    // haetaan alkuaika piirrolle
    DWORD start_time = GetTickCount();

    	// testanaan onko viestiä jonossa
	if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
	   {

	// onko mahdollisesti WM_QUIT viesti
       if (msg.message == WM_QUIT)
           break;

	   TranslateMessage(&msg);

	   // Lähetetään visti eteenpäin viestinkäsittelijälle
	   DispatchMessage(&msg);
	   } // end if

          // tarkastetaan joko pitää vaihtaa väriä
       	  if (++color_change >= 50)
          {
          // nollataan laskuri
          color_change = 0;

	  //jos pen jo olemassa niin poistetaan se
          if (pen)
             DeleteObject(pen);

          // luodaan uusikynä uudella värillä
          pen = CreatePen(PS_SOLID,1,RGB(rand()%256,rand()%256,rand()%256));

          } // end if


       // liikutetaan viivojen päitä
       x1+=x1v;
       y1+=y1v;

       x2+=x2v;
       y2+=y2v;

       x3+=x3v;
       y3+=y3v;

       x4+=x4v;
       y4+=y4v;

       // Testataan ollaanko osuttu ikkunan reunoihin
       //ensimmäinen piste
	   if (x1 < 0 || x1 >= WINDOW_WIDTH-10)
          {
          // käännetään suunta
          x1v=-x1v;

          // tönäistään viiva takaisin reunasta
          x1+=x1v;
          } // end if

       if (y1 < 0 || y1 >= WINDOW_HEIGHT-30)
          {
          // käännetään suunta
          y1v=-y1v;

          // tönäistään viiva takaisin reunasta
          y1+=y1v;
          } // end if


       //toinen piste
       if (x2 < 0 || x2 >= WINDOW_WIDTH-10)
          {
          x2v=-x2v;
          x2+=x2v;
          } // end if

       if (y2 < 0 || y2 >= WINDOW_HEIGHT-30)
          {
          y2v=-y2v;
          y2+=y2v;
          } // end if

	   //kolmas piste
       if (x3 < 0 || x3 >= WINDOW_WIDTH-10)
          {
          x3v=-x3v;
          x3+=x3v;
          } // end if

       if (y3 < 0 || y3 >= WINDOW_HEIGHT-30)
          {
          y3v=-y3v;
          y3+=y3v;
          } // end if

       // neljäs piste
       if (x4 < 0 || x4 >= WINDOW_WIDTH-10)
          {

          x4v=-x4v;
          x4+=x4v;
          } // end if

       if (y4 < 0 || y4 >= WINDOW_HEIGHT-30)
          {
          y4v=-y4v;
          y4+=y4v;
          } // end if


       // valitaan kynä jolla piirretään
	   SelectObject(hdc,pen);

	   //sijoitetaan piirron aloituskohta
       MoveToEx(hdc, x1,y1, NULL);

	   //piirretään viivat
       LineTo(hdc,x2,y2);
	   LineTo(hdc,x3,y3);
	   LineTo(hdc,x4,y4);
	   LineTo(hdc,x1,y1);


       // lukitaan piirto noin 33millisekuntiin
       while((GetTickCount() - start_time) < 33);

	   //valitaan kynä jolla pyyhitään
	   SelectObject(hdc,e_pen);

	   //sijoitetaan piirron aloituskohta
       MoveToEx(hdc, x1,y1, NULL);

	   //piirretään viivat
       LineTo(hdc,x2,y2);
	   LineTo(hdc,x3,y3);
	   LineTo(hdc,x4,y4);
	   LineTo(hdc,x1,y1);


       // katsotaan onko painettu esc nappia
	   if (KEYDOWN(VK_ESCAPE))
          SendMessage(hwnd, WM_CLOSE, 0,0);

	} // end while


// vapautetaan DC
ReleaseDC(hwnd,hdc);

// lopetetaan ohjelma ja palataan windowsiin
return(msg.wParam);

} // end WinMain

///////////////////////////////////////////////////////////

mikko [15.10.2002 14:57:59]

#

Taitaa olla Visual C++.

mikko [15.10.2002 14:59:10]

#

Unohtakaa tuo edellinen :)

KimmoKM [15.10.2002 17:10:38]

#

Voi kun gcc kääntäisi cplusplussaa...

tomageeni [15.10.2002 20:05:59]

#

KimmoKM eikö se sitten käännä? g++ komento kääntää gcc:ssä

progo [15.10.2002 21:05:06]

#

Kun on tarvittavat includet ja kirjastot, niin gcc paska.cpp -liostream tekee sen, mitä pitääkin. Normaalit käännösoptiot toimivat myös.
Jos ei jaksa kirjoittaa -liostreamia jokaisen komentorivin jälkeen, pitäisi gxx (jne).. komennon workkia.

Pekkuli [16.10.2002 22:06:28]

#

Jos ei jaksa kirjoittaa -/iostreamia jokaisen komentorivin jälkeen, voi tehdä batin, joka pistää iostreamin sinne minne pitääkin.

KimmoKM [17.10.2002 16:55:48]

#

No g++ kääntää (en tiennytkään siitä)

(nimetön) [22.10.2002 17:17:22]

#

Eipä taida DJGPP kääntää tota...

akx [29.09.2003 15:00:22]

#

Ei DJGPP osaa Windowsille kääntää. www.mingw.org


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta