/****************************************************************************/ /* ** Malliohjelma kauan kestävästä piirtämisestä. ** Piirretään rekursiivisesti joukko kolmioita. ** ** Vesa Lappalainen 16.8.1992 ** ** Kääntäminen: ** Tee projektio kolmio.prj: ** sample.c ** kolmio.c ** sample.def ** ** Tehtäviä 1) Kokeile piirtämisen aikana valita ikkunan suurennus tms. tai ** paina vaikkapa kahdesti (molemmat välillä irti) ALT-TAB. ** Säädä ohjelman suoritusaikaa muuttelemalla vakiota ** PIENIN_KOLMIO (pieni->kauan, iso-> nopea). ** Mikä vika on ohjelmassa? ** ** Käynnistä samanaikaisesti jokin toinen ohjelma ja säädä sen ** ikkunan niin pieneksi, ettei se peitä kuin osaksi "Kolmiot" ** ikkunaa. Liata sitten ikkunoiden järjestys siten, että ** "Kolmiot"-ikkuna on toiseksi ylin ja avaamasi pikku-ikkuna ** on ylimpänä. Siirtele pikkuikkunaa kolmiot ikkunan päällä! ** ** 2) Ohjelmaan liittyy myös "höpö-höpö"-piirtäminen. Miten luulet ** piirtämisen toimivan? Käy välillä toisessa ikkunassa ja ** palaa takaisin ohjelmaan. Mitä käy piirroksille? ** ** 3) Muuta "piirtäminen" sellaiseksi, että kun hiiren nappi ** painetaan alas, aletaan piirtää murtoviivaa kunnes ** nappi päästetään ylös. Mitä tapahtuu kun nappi ** päästetäänkin ylös "Kolmiot"-ikkunan ulkopuolella ja ** sitten tuodaan hiiri takaisin ikkunan sisälle nappi ** ylhäällä? ** ** 4) Miten "Piirtäminen" pitäisi muuttaa, jotta kuva korjautuisi ** toisessa ikkunassa käymisen jälkeen? ** ----------------------------------------------------------------------------*/ #include #include #include "timer.h" static int stop = 0; /****************************************************************************/ int CheckMessage(void) { MSG msg; int i=0; if ( stop ) return 1; while ( PeekMessage(&msg,NULL,0,0,PM_REMOVE | PM_NOYIELD) ) { switch ( msg.message ) { case WM_PAINT: return 0; case WM_QUIT: stop = 1; return 1; } #if 1 TranslateMessage(&msg); /* Tulkitaan virtuaaliset näp. koodit */ DispatchMessage(&msg); /* Lähetetään viesti ikkunalle */ stop = 0; #endif i = 0; } /* return 0; */ return i; } char *WindowName = "Kolmiot"; #define PIENIN_KOLMIO 2 /* Säädä tällä kauanko koko kuvan piirt. kest. */ #define I(x,y) hdc,((int)(x)),((int)(y)) /****************************************************************************/ void kolmio(HDC hdc, double x, double y, double h) { double s2 = h / (sqrt(3)); if ( CheckMessage() ) return; MoveTo(I(x,y)); LineTo(I(x-s2,y-h)); LineTo(I(x+s2,y-h)); LineTo(I(x,y)); if ( h < PIENIN_KOLMIO ) return; kolmio(hdc,x-s2,y,h/2); /* Pienempi kolmio vasemmalle */ kolmio(hdc,x+s2,y,h/2); /* Pienempi kolmio oikealle */ kolmio(hdc,x,y-h,h/2); /* Pienempi kolmio yläpuolelle*/ } /****************************************************************************/ void MyDraw(HWND hWnd) { PAINTSTRUCT ps; stop = 0; SetWindowText(hWnd,"Piiretään..."); BeginPaint(hWnd,&ps); start_timer(1); kolmio(ps.hdc,300,400,200); SetWindowText(hWnd,stop_timer(1)); EndPaint(hWnd,&ps); } /****************************************************************************/ /* ** Seuraavissa aliohjelmissa on seuraavat parametrit: ** ** hWnd - ikkunan kahva ** wParam - SHIFT, CTRL ja ALT -näppäimen tile, voidaan testata esim. ** if ( wParam && MK_CONTROL ) ... hommat jos CTRL alhaalla ** lParam - x = LOWORD(lParam) ja y = HIWORD(lParam) ** kätevämpi on kuitenkin selvittää hiren paikka: ** POINT pt = MAKEPOINT(lParam) ** ----------------------------------------------------------------------------*/ static POINT old = {0,0}; static pen_down = 0; /****************************************************************************/ void MyDown(HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiren nappa on painettu alas */ { old = MAKEPOINT(lParam); pen_down = 1; if (hWnd || wParam || lParam); } /****************************************************************************/ void MyUp (HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiren nappi on päästetty ylös */ { pen_down = 0; if (hWnd || wParam || lParam); } /****************************************************************************/ void MyMove(HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiri on liikkunut */ { HDC hDC; POINT pt = MAKEPOINT(lParam); if (wParam || lParam); if ( !pen_down ) return; if ( ( hDC = GetDC(hWnd) ) == NULL ) return; MoveTo(hDC,old.x,old.y); LineTo(hDC,pt.x,pt.y); ReleaseDC(hWnd,hDC); }