/**************/ /* kolmiom.c */ /****************************************************************************/ /* ** Malliohjelma kauan kestävästä piirtämisestä. ** Piirretään rekursiivisesti joukko kolmioita. ** ** Vesa Lappalainen 16.8.1992 ** ** Kääntäminen: ** Tee projektio kolmiom.prj: ** samplewm.c ** + ne jotka on sanottu samplewm.c:ssa ** kolmiom.c ** timer.c ** samplewm.def ** ** Tähän versioon on lisätty kolmionpiirto"silmukkaan" kutsu ** CheckMessage, joka mahdollistaa moniajon. ** ** Tehtäviä 1) Kokeile toimiiko muut ohjelmat nyt yhtäaikaisesti piirron ** kanssa. ** ** 2) Kokeile toimiiko ohjelman hiirellä piirtäminen kuvan ** uudelleen piirron kanssa yhtäaikaa. ** ** 3) Kirjoita ohjelma, joka "värittää" ikkunaan mustan neliön ** vetämällä siihen alekkaisia viivoja. ** Toimiiko moniajossa? ** ----------------------------------------------------------------------------*/ #include #include "samplewm.h" #include #include #include "timer.h" char *WindowName = "Kolmiom"; #define PIENIN_KOLMIO 0.5 /* 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; /* Tämä mahdollistaa "moniajon"!!!!!!!! */ 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,HDC hDC) { char s[100]; SetWindowText(hWnd,"Kolmiom: Piirretään..."); start_timer(1); kolmio(hDC,300,400,200); sprintf(s,"Kolmiom: %4.2lf s.",stop_timer(1)); SetWindowText(hWnd,s); } /****************************************************************************/ /* ** 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 */ { #pragma argsused old = MAKEPOINT(lParam); pen_down = 1; } /****************************************************************************/ void MyUp (HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiren nappi on päästetty ylös */ { #pragma argsused pen_down = 0; } /****************************************************************************/ void MyMove(HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiri on liikkunut */ { #pragma argsused HDC hDC; POINT pt = MAKEPOINT(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); }