/**************/ /* satky.c */ /****************************************************************************/ /* ** Malliohjelma "animaatiosta": ** Sätky-ukko osoittaa missä hiiri menee. ** ** Käyttö: Tee projekti show_man.prj jossa on: ** samplew.c ** satky.c ** samplew.def ** ja aja. ** ** ** Vesa Lappalainen 15.8.1992 ** ** Animaation idea ks. show_man.c ** 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 char *WindowName = "Sätkyukko"; typedef struct { int pituus; double suunta; POINT alku; } jasen_tyyppi; int Jasen = 0; /* 0 = Oikea käsi, 1 = oik. jalk, 2 = vas. käs, 3 = vas. jalk*/ #define RAD(d) ((d)*M_PI/180.0) static jasen_tyyppi Jasenet[4] = { { 80, RAD( -30) , { 60, 90} }, { 90, RAD( -60) , { 60,180} }, { 80, RAD(180+30) , { 60, 90} }, { 90, RAD(180+60) , { 60,180} } }; /****************************************************************************/ #define POINT_TO_2(pt) pt.x,pt.y /* Pisteestä 2 erillistä lukua */ #define POINT_PLUS_RA(pt,r,a) \ pt.x+r*cos(a),pt.y-r*sin(a) /* Piste + r*suunta */ /****************************************************************************/ void PiirraNotJasen(HDC hdc,jasen_tyyppi *jasen) /* Piirretään ukon oikea käsi NOT-kynällä. */ { SelectObject(hdc,GetStockObject(NULL_BRUSH)); SetROP2(hdc,R2_NOT); MoveTo(hdc,POINT_TO_2(jasen->alku)); LineTo(hdc,POINT_PLUS_RA(jasen->alku,jasen->pituus,jasen->suunta)); } /****************************************************************************/ int muuta_kaden_suunta(HDC hDC, LONG lParam, jasen_tyyppi *jasen) { int dx,dy; POINT pt = MAKEPOINT(lParam); PiirraNotJasen(hDC,jasen); /* Pyyhitään vanha jäsen pois */ dx = pt.x - jasen->alku.x; dy = pt.y - jasen->alku.y; if ( dx || dy ) jasen->suunta = atan2(-dy,dx); PiirraNotJasen(hDC,jasen); /* Piirretään uusi jäsen tilalle */ return 1; } /****************************************************************************/ void MyDraw(HWND hWnd, HDC hDC) { #pragma argsused int i; Ellipse(hDC,40,40,80,80); /* Pää */ MoveTo(hDC, 60, 80); LineTo(hDC, 60,180); /* Keskivartalo */ for (i=0; i<4; i++) PiirraNotJasen(hDC,&Jasenet[i]); /* Jäsenet */ } /****************************************************************************/ /* ** 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, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiren nappa on painettu alas */ { #pragma argsused if ( ++Jasen > 3 ) Jasen = 0; } /****************************************************************************/ void MyUp (HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiren nappi on päästetty ylös */ { #pragma argsused if ( ++Jasen > 3 ) Jasen = 0; } /****************************************************************************/ void MyMove(HWND hWnd, WORD wParam, LONG lParam) /* Aliohjelmaa kutsutaan kun hiiri on liikkunut */ { #pragma argsused HDC hDC; if ( ( hDC = GetDC(hWnd) ) == NULL ) return; muuta_kaden_suunta(hDC,lParam,&Jasenet[Jasen]); ReleaseDC(hWnd,hDC); }