/**************/ /* laskurm4.c */ /**************************************************************************** ** PROGRAM: laskurm4.c ** Windows: Win 3.1 & WIN32 ** Editor: Vesa Lappalainen ** PURPOSE: Autolaskuri tehtynä mahd. pitkälle Windowsin resursseilla. ** Ominaisuudet: ** 1. Tiedostojen käyttö yleistetty siten, että aliohjelmia ** voidaan käyttää muuallakin. ** 2. Tiedostoa luetaan ja kirjoitetaan oikeasti. ** 3. Laskureiden sisältö saadaan leikekirjaan. ** 4. Laskureiden sisältö talletetaan INI-tiedostoon. ** 5. Menut useilla kielillä. ** 6. Kielen valinta menussa lipun kuvalla. ** 7. Valittu kieli näkyy oikeassa alakulmassa lipun kuvana, jota ** napauttamalla voidaan myös vaihtaa kieli. ** 8. Taustakuvana Mona Lisa. ** 9. Autoja ajelee kuvassa edestakaisin. ** 10. Autojen ominaisuudet ja määrä määrätään .INI-tiedostossa ** (ks. autot.c-tiedosto, funktio alusta_autot()) ** 11. Koska dialogi luodaan luokkana, toimii ikoni kunnolla. ** 12. INI-tiedostoa etsitään mm siitä hakemistosta josta ** tämä ohjelma käynnistyi. ** ** Ohjelmakoodin on merkitty mikä osa koodista on mitäkin ** ominaisuutta varten. Jos ominaisuus on merkitty heti ** aliohjelman otsikon viereen, niin koko aliohjelma on ko. ** ominaisuutta varten. Seuraavat ominaisuudet on merkitty: ** auto - autojen ylläpito ** ini - tietojen kirjoittaminen ja lukeminen .INI-tiedostoon ** kie - eri kieliset menut ja lipun kuva ** lei - leikekirjan käsittely ** per - perustoiminnot eli laskeminen ja nollaus ** tau - taustakuvan hoitaminen ** tie - tiedoston käsittely ** tbl - responce taulukon käyttö ** +/- - laskurin suunnan vaihto ** ** Project: ** laskurm4.c - tämä tiedosto ** laskurm4.rc - resurssit ** laskurm4.def - moduulin määrittely ** tiedleik.c - tiedostot ja leikekirjan käsittely ** kieli.c - eri kielisten menujen käyttö ** ALI\autotw.c - autojen liikuttelu näytöllä ** ALI\tausta.c - taustan ja ikonin piirto ** ALI\tabhand.c - viestitaulukon käsittely ** ALI\mdialog.c - dialogien käsittely ** ALI\filename.c - tiedoston nimen yms. käsittely ** ALI\mjonot.c - merkkijonojen käsittely (filename tarvitsee) ** ALI\clipboard.c - leikekirjan käsittely ** ALI\ininame.c - initiedoston etsiminen ** ALI\bitmap.c - bittikarttojen käsittely ** ** Tehtäviä: 1) Lisää ohjelmaan ruotsinkieli (ja lippu) (ei muutok. .c:hen) ** ** 2) Muuta ohjelmaa siten, että se seuraavan kerran ** käynnistyessään muistaa viimeksi käytetyn kielen. ** Miten kieli voitaisiin tallettaa .INI-tiedostoon ** merkkijonona? ** ** 3) Kokeile näkyykö auton ikkunoista läpi, mikäli ne on ** piirretty valkoisella. (ei muutok. .c:hen) ** ** 4) Lisää ohjelmaan mopo ajelemaan edestakaisin. ** (ei muutok. .c:hen) ** ****************************************************************************/ #include /* per */ #include "tabhand.h" /* tbl */ #include "mdialog.h" /* dia */ #include "autot.h" /* auto */ #include "kieli.h" /* kie */ #include "laskurm4.h" /* per */ #include "tausta.h" /* tau */ #include "ininame.h" /* ini */ static char ININAME[80]; /* ini */ /***************************************************************************/ /* Luodaan dialogi luokkana, jolloin ikoni toimii kunnolla: */ TblClassDlgMAIN("LASKURM4","ikoni","PIKA","LASKURI",MsgTbl); /* tbl */ static int suunta = 1; /* +/- */ /***************************************************************************/ /* Tapahtumien käsittelijät: */ /***************************************************************************/ static EVENT lisaa(tMSGParam *msg) { ShowStatic(msg->hWnd,msg->id-HA+HAL,laskurit[msg->id-HA]+=suunta);/* per */ return Changed(&File); /* HUOM! ^^^^^^^^^*/ /* tie */ } static EVENT nollaa(tMSGParam *msg) { nollaa_laskurit(msg->hWnd,laskurit); /* per */ return Changed(&File); /* tie */ } static EVENT lopeta(tMSGParam *msg) { WritePrivateProfileString(WTITLE,WTITLE, /* ini */ laskurit_tekstiksi(laskurit),ININAME); /* ini */ if ( NewFile(msg->hWnd,&File) ) return 0; /* tie */ PostQuitMessage(0); /* per */ return 0; } /*-------------------------------------------------------------------------*/ /* Seuraavat laitetaan resp.bat -ohjelman avulla automaattisesti taulukkoon*/ /* koska niiden tyyppi on EVENT ja ne alkavat WM_ */ /*-------------------------------------------------------------------------*/ /* Yleiset ikkunaviestit: */ static EVENT WM_initdialog(tMSGParam *msg) { char s[50]; /* ini */ FindIniFileName(ININAME,sizeof(ININAME),"LASKURI.INI"); /* ini */ GetPrivateProfileString(WTITLE,WTITLE,"",s,sizeof(s),ININAME); /* ini */ teksti_laskureiksi(msg->hWnd,s,laskurit); /* ini */ AlustaKielet(msg->hWnd); /* kie */ AlustaTaustaHWND(GetWindowInstance(msg->hWnd),msg->hWnd,"TAUSTA",0);/*tau*/ alusta_autot(NULL,msg->hWnd,ININAME); /* auto*/ return 0; } /*-------------------------------------------------------------------------*/ /* FILE */ static EVENT WM_command_IDM_FILE_NEW(tMSGParam *msg) /* tie */ { return NewFile(msg->hWnd,&File); } static EVENT WM_command_IDM_FILE_OPEN(tMSGParam *msg) /* tie */ { return OpenAndReadFile(msg->hWnd,&File);; } static EVENT WM_command_IDM_FILE_SAVEAS(tMSGParam *msg) /* tie */ { return SaveFileAs(msg->hWnd,&File); } static EVENT WM_command_IDM_FILE_SAVE(tMSGParam *msg) /* tie */ { return SaveFile(msg->hWnd,&File); } /*-------------------------------------------------------------------------*/ /* EDIT */ static EVENT WM_command_IDM_EDIT_CUT(tMSGParam *msg) /* lei */ { laskurit_leikekirjaan(msg->hWnd,laskurit); return nollaa_laskurit(msg->hWnd,laskurit); } static EVENT WM_command_IDM_EDIT_COPY(tMSGParam *msg) /* lei */ { return laskurit_leikekirjaan(msg->hWnd,laskurit); } static EVENT WM_command_IDM_EDIT_PASTE(tMSGParam *msg) /* lei */ { return leikekirja_laskureihin(msg->hWnd,laskurit); } /*-------------------------------------------------------------------------*/ /* OPTIONS */ static EVENT WM_command_IDM_OPTIONS_INC(tMSGParam *msg) /* +/- */ { HMENU hMenu = GetMenu(msg->hWnd); CheckMenuItem(hMenu,IDM_OPTIONS_DEC,MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hMenu,IDM_OPTIONS_INC,MF_BYCOMMAND | MF_CHECKED); suunta = 1; return 0; } static EVENT WM_command_IDM_OPTIONS_DEC(tMSGParam *msg) /* +/- */ { HMENU hMenu = GetMenu(msg->hWnd); CheckMenuItem(hMenu,IDM_OPTIONS_DEC,MF_BYCOMMAND | MF_CHECKED); CheckMenuItem(hMenu,IDM_OPTIONS_INC,MF_BYCOMMAND | MF_UNCHECKED); suunta = -1; return 0; } /***************************************************************************/ static tMSGEntry MsgTbl[] = { /* tbl */ LOOK_TABLE(TaustaMsgTbl), /* tau */ LOOK_TABLE(LanguageMsgTbl), /* kie */ { WM_COMMAND , TRANGE , DoC, lisaa , 0 , 0, HA,HA+LASKUREITA-1}, { WM_COMMAND , NOLLAA , DoC, nollaa , 0 , 0}, /* per */ { WM_COMMAND , IDM_FILE_EXIT , DoC, lopeta , 0 , 0}, /* per */ { WM_COMMAND , IDCANCEL , DoC, lopeta , 0 , 0}, /* per */ { WM_COMMAND , EXIT , DoC, lopeta , 0 , 0}, /* per */ { WM_INITDIALOG , DoC , DoC , WM_initdialog }, /*a*/ { WM_COMMAND , IDM_FILE_NEW , DoC , WM_command_IDM_FILE_NEW }, /*a*/ { WM_COMMAND , IDM_FILE_OPEN , DoC , WM_command_IDM_FILE_OPEN }, /*a*/ { WM_COMMAND , IDM_FILE_SAVEAS , DoC , WM_command_IDM_FILE_SAVEAS }, /*a*/ { WM_COMMAND , IDM_FILE_SAVE , DoC , WM_command_IDM_FILE_SAVE }, /*a*/ { WM_COMMAND , IDM_EDIT_CUT , DoC , WM_command_IDM_EDIT_CUT }, /*a*/ { WM_COMMAND , IDM_EDIT_COPY , DoC , WM_command_IDM_EDIT_COPY }, /*a*/ { WM_COMMAND , IDM_EDIT_PASTE , DoC , WM_command_IDM_EDIT_PASTE }, /*a*/ { WM_COMMAND , IDM_OPTIONS_INC , DoC , WM_command_IDM_OPTIONS_INC }, /*a*/ { WM_COMMAND , IDM_OPTIONS_DEC , DoC , WM_command_IDM_OPTIONS_DEC }, /*a*/ { 0 } };