/**************/ /* show_man.c */ /****************************************************************************/ /* ** Malliohjelma "animaatiosta": ** Tikku-ukko osoittaa oikealla kädellään missä hiiri menee. ** ** Käyttö: Tee projekti show_man.prj jossa on: ** samplew.c ** show_man.c ** samplew.def ** ja aja. ** ** ** Vesa Lappalainen 15.8.1992 ** ** Animaation idea: ** 1. kuva on piirretty valmiiksi ** 2. kun jotakin osaa kuvasta pitää siirtää, pyyhitään vanha osa pois ** 3. lasketaan osan uusi paikka ja/tai muoto ** 4. piirretään uudistettu osa ** ** "Rautalankamallissa" pyyhkiminen käy siten, että piirretään ** kuvan osa kynällä, joka muuttaa kaikki pisteet päinvastaisen ** värisiksi (mm. musta piste muuttuu valkoiseksi ja päinvastoin). ** Kun tällaisella kynällä piirretään kaksi kertaa sama kuva, ei ** tuloksena olekaan mitään, siis joka toisella kerralla kuva häviää. ** ** Monimutkaisemmassa tapauksessa kuvan osan alla oleva taustakuva ** pitää ensin tallettaa ja sitten piirtää vasta kuvan osa. ** Siirrossa tausta palautetaan ja luetaan uusi tausta uudesta ** paikasta ja sitten piirretään uusi osa. ** ** Tehtäviä: 1) Ukon käsi saadaan monistumaan seuraavasti: ** - siirää ja muotoile ikkuna siten, että se menee aavistuksen ** toisen ikkunan päälle (esim. Program Managerin) ** - aktivoi tämä toinen ikkuna hiirellä ** - siirrä hiiri yläkautta ukko-ikkunan otsikkokenttään ** - paina hiirtä aktivoidaksesi ukko-ikkunan ** - siirry ukko-ikkunaan ja nyt ukolla pitäisi olla 3 kättä ** Miksi? Miten vika voitaisiin korjata? ** ** 2) Muuta ohjelmaa siten, että kun hiiren nappi painetaan ** alas, kääntyy vasen käsi osoittamaan hiiren suuntaa ** painamishetkellä. Oikea käsi osoittaa koko ajan. ** ** 3) Tee sama vasemmalle jalalle. Miten muuttujien ja tyyppien ** nimet tällöin kannattaa muuttaa? ** ** 4) Muuta ohjelmaa siten, että aluksi oikea käsi osoittaa kursoria ** Kun nappi painastaan alas, lukittuu oikea käsi paikalleen ja ** oikea jalka rupeaa osoittamaan hiirtä niin kauan kun nappi ** on alhaalla. Kun nappi päästetää ylös, alkaa vasen käsi ** osoittamaan kursoria ja kun nappi painetaan alas alkaa ** vasen jalka ja kun nappi päästetään ylös, ollaan jälleen ** alkuperäisessä tilanteessa, eli oikea käsi osoittaa jne... ** ** ----------------------------------------------------------------------------*/ #include #include #include "portable.h" char *WindowName = "Näyttäjä-ukko"; typedef struct { int pituus; double suunta; POINT alku; } kasi_tyyppi; static kasi_tyyppi Oikea = { 80, 0.0, {60,90} }; /****************************************************************************/ #define POINT_TO_2(pt) pt.x,pt.y /* Pisteestä 2 erillistä lukua */ #define POINT_PLUS_RA(pt,r,a) \ (int) (pt.x+r*cos(a)), (int) (pt.y-r*sin(a)) /* Piste + r*suunta */ /****************************************************************************/ void PiirraNotKasi(HDC hdc,kasi_tyyppi *kasi) /* Piirretään ukon oikea käsi NOT-kynällä. */ { /* SelectObject(hdc,GetStockObject(NULL_BRUSH)); */ SetROP2(hdc,R2_NOT); MoveToEx(hdc,POINT_TO_2(kasi->alku),NULL); LineTo(hdc,POINT_PLUS_RA(kasi->alku,kasi->pituus,kasi->suunta)); } /****************************************************************************/ int muuta_kaden_suunta(HDC hDC, LPARAM lParam, kasi_tyyppi *kasi) { int dx,dy; POINTS pt = MAKEPOINTS(lParam); PiirraNotKasi(hDC,kasi); /* Pyyhitään vanha käsi pois */ dx = pt.x - kasi->alku.x; dy = pt.y - kasi->alku.y; if ( dx || dy ) kasi->suunta = atan2(-dy,dx); PiirraNotKasi(hDC,kasi); /* Piirretään uusi oikea käsi tilalle */ return 1; } /****************************************************************************/ void MyDraw(HWND hWnd,HDC hDC) { #pragma argsused /* SelectObject(hDC,GetStockObject(BLACK_BRUSH)); */ HBRUSH hBrRed,vanha; hBrRed = CreateSolidBrush(RGB(255,0,0)); vanha = SelectObject(hDC,hBrRed); Ellipse(hDC,40,40,80,80); /* Pää */ SelectObject(hDC,vanha); DeleteObject(hBrRed); MoveToEx(hDC, 60, 80, NULL); LineTo(hDC, 60,180); /* Keskivartalo */ LineTo(hDC, 20,260); /* Vasen jalka */ MoveToEx(hDC, 60,180, NULL); LineTo(hDC,100,260); /* Oikea jalka */ MoveToEx(hDC, 20,170, NULL); LineTo(hDC, 60, 90); /* Vasen käsi */ PiirraNotKasi(hDC,&Oikea); /* Oikea käsi */ } /****************************************************************************/ /* ** 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) ** ----------------------------------------------------------------------------*/ /****************************************************************************/ void MyDown(HWND hWnd, WPARAM wParam, LPARAM lParam) /* Aliohjelmaa kutsutaan kun hiiren nappa on painettu alas */ { #pragma argsused } /****************************************************************************/ void MyUp(HWND hWnd, WPARAM wParam, LPARAM lParam) /* Aliohjelmaa kutsutaan kun hiiren nappi on päästetty ylös */ { #pragma argsused } /****************************************************************************/ void MyMove(HWND hWnd, WPARAM wParam, LPARAM lParam) /* Aliohjelmaa kutsutaan kun hiiri on liikkunut */ { #pragma argsused HDC hDC; if ( ( hDC = GetDC(hWnd) ) == NULL ) return; muuta_kaden_suunta(hDC,lParam,&Oikea); ReleaseDC(hWnd,hDC); }