/**************/ /* laskurm4.c */ /**************************************************************************** ** PROGRAM: laskurm4.c ** PURPOSE: Autolaskuri tehtynä mahd. pitkälle Windowsin resursseilla. ** Tiedostojen käyttö yleistetty siten, että aliohjelmia ** voidaan käyttää muuallakin. ** Tiedostoa luetaan ja kirjoitetaan oikeasti. ** Laskureiden sisältö saadaan leikekirjaan. ** Laskureiden sisältö talletetaan INI-tiedostoon. ** Menut useilla kielillä. ** Kielen valinta menussa lipun kuvalla. ** Valittu kieli näkyy oikeassa alakulmassa lipun kuvana, jota ** napauttamalla voidaan myös vaihtaa kieli. ** Taustakuvana Mona Lisa. ** Henkilöauto ajelee kuvassa edestakaisin. ** Autojen ominaisuudet ja määrä määrätään .INI-tiedostossa ** (ks. autot-tiedosto, funktio alusta_autot()) ** ** Editor: Vesa Lappalainen ** Projektiin tarvitaan ** laskurm4.c - tämä tiedosto ** laskurm4.def - moduulin määrittely ** laskurm4.rc - resurssit ** tiedleik.c - tiedostot ja leikekirjan käsittely ** kieli.c - eri kielisten menujen käyttö ** ALI\autot.c - autojen liikuttelu näytöllä ** ALI\filename.c - tiedoston nimen yms. käsittely ** ALI\tausta.c - taustan ja ikonin piirto ** ALI\clipboard.c - leikekirjan käsittely ** ALI\mjonot.c - mm. filename tarvitsee ** ** Tehtäviä: 1) Lisää ohjelmaan ruotsinkieli (ja lippu) ** ** 2) Muuta ohjelmaa siten, että se seuraavan kerran ** käynnistyessään muistaa viimeksi käytetyn kielen ** ** 3) Kokeile näkyykö auton ikkunoista läpi, mikäli ne on ** piirretty valkoisella. ** ** 4) Lisää ohjelmaan mopo ajelemaan edestakaisin. ** ** 5) Lisää ohjelmaan useita kulkuneuvoja ajelemaan eri tahtia ** ****************************************************************************/ #include /* Tarvitaan kaikissa Windows C-ohjelmissa */ #include #include #include #include "filename.h" #include "autot.h" #include "kieli.h" #include "laskurm4.h" #include "tausta.h" static int laskurit[LASKUREITA] = {0,0}; static FileType File={ "", /* Tiedoston nimi, aluksi "" */ WTITLE, /* Ikkunan otsikko, jonka perään tied.nimi */ 1, /* Luetun funktion tyyppi, ks. szFilter */ "Laskuri (*.las)\0*.las\0Teksti (*.txt)\0*.txt\0Kaikki (*.*)\0*.*\0", 0, /* Onko tiedostoa muutettu. */ MySave, /* Osoitin talletusfunktioon */ MyRead, /* Osoitin lukufunktioon */ MyNew, /* Osoitin tiedon nollausfunktioon */ laskurit /* Osoitin varsinaiseen dataan. */ }; /***************************************************************************/ BOOL CALLBACK_E MainWndProc(HWND hWnd, unsigned message, WPARAM wParam, LPARAM lParam) { #pragma argsused static int suunta = 1; HMENU hMenu; static char s[128]; if ( language_message(hWnd,message,wParam,lParam) ) return TRUE; switch (message) { case WM_ERASEBKGND: PiirraTausta((HDC)wParam); return TRUE; case WM_INITDIALOG: /* Luetaan edellisen kerran arvot */ GetPrivateProfileString(WTITLE,WTITLE,"",s,sizeof(s),WTITLE".INI"); teksti_laskureiksi(hWnd,s,laskurit); if ( !alusta_autot(NULL,hWnd,WTITLE) ) alusta_autot(NULL,hWnd,".\\"WTITLE); return TRUE; // return FALSE; case WM_COMMAND: /* Dialogin toiminnot: */ switch (wParam) { case HA: /* Painonappia painettu */ case KA: ShowStatic(hWnd,wParam-HA+HAL,laskurit[wParam-HA]+=suunta); Changed(&File); return TRUE; case NOLLAA: nollaa_laskurit(hWnd,laskurit); Changed(&File); return TRUE; /* OPTIONS */ case IDM_OPTIONS_INC: hMenu = GetMenu(hWnd); CheckMenuItem(hMenu,IDM_OPTIONS_DEC,MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hMenu,IDM_OPTIONS_INC,MF_BYCOMMAND | MF_CHECKED); suunta = 1; return TRUE; case IDM_OPTIONS_DEC: hMenu = GetMenu(hWnd); CheckMenuItem(hMenu,IDM_OPTIONS_DEC,MF_BYCOMMAND | MF_CHECKED); CheckMenuItem(hMenu,IDM_OPTIONS_INC,MF_BYCOMMAND | MF_UNCHECKED); suunta = -1; return TRUE; /* EDIT */ case IDM_EDIT_CUT: laskurit_leikekirjaan(hWnd,laskurit); nollaa_laskurit(hWnd,laskurit); return TRUE; case IDM_EDIT_COPY: laskurit_leikekirjaan(hWnd,laskurit); return TRUE; case IDM_EDIT_PASTE: leikekirja_laskureihin(hWnd,laskurit); return TRUE; /* FILE */ case IDM_FILE_NEW: NewFile(hWnd,&File); return TRUE; case IDM_FILE_OPEN: OpenAndReadFile(hWnd,&File); return TRUE; case IDM_FILE_SAVEAS: SaveFileAs(hWnd,&File); return TRUE; case IDM_FILE_SAVE: SaveFile(hWnd,&File); return TRUE; case IDM_FILE_EXIT: case IDCANCEL: case EXIT: WritePrivateProfileString(WTITLE,WTITLE, laskurit_tekstiksi(laskurit),WTITLE".INI"); if ( NewFile(hWnd,&File) ) return TRUE; tuhoa_autot(); // DestroyWindow(hWnd); PostQuitMessage(0); return TRUE; case 175: /* Tästä ei saada viestiä! */ MessageBox(hWnd,"Terve!","Painoit ikonia!", MB_APPLMODAL | MB_OK | MB_ICONEXCLAMATION); default: return FALSE; } } return FALSE; } /***************************************************************************/ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { #pragma argsused MSG msg; HWND hWndL; FARPROC lProc = MakeProcInstance((FARPROC)MainWndProc,hInstance); HACCEL hAccel = LoadAccelerators(hInstance,"PIKA"); AlustaTausta(hInstance,"TAUSTA"); hWndL = CreateDialog(hInstance,"LASKURI",NULL,(DLGPROC)lProc); if ( !hWndL ) goto lopetus; /* SetClassWord(hWndL, GCW_HICON, ikoni); VAARALLINEN, ÄLÄ KÄYTÄ */ /* Käyttö muuttaa kaikkien Dialogien ikonin! */ AlustaMenut(hInstance,hWndL); while ( GetMessage(&msg,NULL,NULL,NULL) ) { if ( TranslateAccelerator(hWndL,hAccel,&msg) ) continue; if ( IsDialogMessage(hWndL,&msg) ) continue; TranslateMessage(&msg); /* Tulkitaan virtuaaliset näp. koodit */ DispatchMessage(&msg); /* Lähetetään viesti ikkunalle */ } PoistaMenut(); lopetus: PoistaTausta(); (void)FreeProcInstance(lProc); return 0; }