/**************/ /* nappulat.c */ /****************************************************************************/ /* ** Aliohjelmakirjasto nappuloiden ja laskureiden piirt„miseksi n„yt”lle. ** ** Kutsuvassa ohjelmassa m„„ritell„„n taulukko n„pp„imist„ ja ** taulukko laskureista. ** ** N„pp„imen painamista joko n„pp„imist”lt„ tai hiirelt„ odotetaan ** aliohjelmalla 'lue_komento'. Aliohjelma palauttaa valittua ** komentoa vastaavan tunnuksen. Tunnukset on m„„ritelty ** k„ytt„j„n ohjelmassa. Negatiiviset tunnukset on varattu ** systeemik„ytt””n ja k„ytt„j„n ohjelman on reagoitava my”s niihin. ** Esim. mik„li palautetaan komento PIIRRA, pit„„ k„ytt„j„n piirt„„ ** koko n„ytt” uudelleen (koska joku on sen sotkenut). ** */ #include #include #include #include #include #include "hiiru.h" #include "nappulat.h" #include "piirra.c" /****************************************************************************/ #define SKAALAA_XY \ x = (int)(((long int)x - MIN_H_X) * ( MAX_X - MIN_X + 1) /\ ( MAX_H_X - MIN_H_X +1 ) + MIN_X);\ y = (int)(((long int)y - MIN_H_Y) * ( MAX_Y - MIN_Y + 1) /\ ( MAX_H_Y - MIN_H_Y +1 ) + MIN_Y); /****************************************************************************/ /* Globaali muuttuja hiiren olemassaololle: */ static int HIIRI = 0; /****************************************************************************/ int /* 0 koord. ei laatikossa */ laatikossa( /* 1 koord on laatikossa */ laatikko_tyyppi *tila, int x, int y ) { if ( tila->vasen_yla.x > x ) return 0; if ( tila->vasen_yla.y > y ) return 0; if ( tila->vasen_yla.x + tila->koko.x <= x ) return 0; if ( tila->vasen_yla.y + tila->koko.y <= y ) return 0; return 1; } /****************************************************************************/ int /* -1 jollei hiiri mink„„n napin koh */ tutki_hiiri( /* napin numero, jonka kohdalla hiiri*/ nappain_tyyppi *nappaimet, laskuri_tyyppi *laskurit ) { int i,nappi1,nappi2,montako,x,y; if ( laskurit ); /* H„m„yst„, jottei k„„nt„j„ valita */ if ( !HIIRI ) return -1; hiirenpainallukset(0,&nappi1,&nappi2,&montako,&x,&y); SKAALAA_XY; if ( !montako ) return -1; for (i=0; nappaimet[i].valinta_kirjain; i++) { if ( laatikossa(&nappaimet[i].nappain,x,y) ) return i; } return -1; } /****************************************************************************/ int lue_komento( /* */ nappain_tyyppi *nappaimet, laskuri_tyyppi *laskurit, int *lisa ) /* ** Funktio palauttaa valitun komennon tunnuksen ja mahdollisen lis„viestin. ** Funktiosta palataan vasta kun oikeata n„pp„int„ on painettu. ** Mik„li n„pp„int„ ei ole painettu, tutkitaan onko hiirikursori jonkin ** n„pp„imen kuvan p„„ll„. Jos on, palautetaan t„m„ tieto. ** T„m„ aliohjelma sytytt„„ ja sammuttaa hiirikursorin, joten muualla ** ohjelmassa hiirest„ ei tarvitse tiet„„ muutakuin alustaa se kerran. */ { char c; int i; *lisa = 0; if ( HIIRI ) naytahiirikursori(); while (1) { if ( kbhit() ) { c = toupper(getch()); for (i=0; nappaimet[i].valinta_kirjain; i++) if ( nappaimet[i].valinta_kirjain == c ) goto palauta; } if ( ( i = tutki_hiiri(nappaimet,laskurit) ) >= 0 ) goto palauta; } palauta: if ( HIIRI ) katkehiirikursori(); *lisa = nappaimet[i].lisa_viesti; return nappaimet[i].komento; } /****************************************************************************/ void nollaa_laskurit(laskuri_tyyppi *laskurit) { int i; for (i=0; laskurit[i].tunnus; i++) { laskurit[i].arvo=0; nayta_laskuri(&laskurit[i]); } } /****************************************************************************/ void lisaa_laskuria(laskuri_tyyppi *laskurit,int tunnus) { int i; for (i=0; laskurit[i].tunnus; i++) { /* Ets. laskuri */ if ( laskurit[i].tunnus == tunnus ) { laskurit[i].arvo++; nayta_laskuri(&laskurit[i]); return; } } } /****************************************************************************/ void alusta_nappulat(void) { HIIRI = alustahiiri(); } /****************************************************************************/ void tyhjenna_ruutu(void) { textcolor(WHITE); textbackground(WHITE); clrscr(); }