/**************/ /* laskurm3.c */ /**************************************************************************** ** PROGRAM: laskurm3.c ** Windows: Win 3.1 & WIN32 ** 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. ** Editor: Vesa Lappalainen ** Project: ** laskurm3.c - tämä tiedosto ** ..\laskurir.def - moduulin määrittely ** ..\menu2\laskurm2.rc - resurssit ** 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 ** ** Tehtäviä: 1) Lukeminen ja kirjoittaminen on nyt tehty malliksi ** ei-ANSI-kutsuilla _lread ja _lwrite, jotta tiedosto ** voidaan avata OpenFile-kutsulla. Tämä kutsu mahdollistaa ** paremmin pitkien tiedostojen käsittelyssä tarvittavan ** välillä tehtävän sulkemisen ja avaamisen (miksi tarvitaan?) ** Tässä ohjelmassa voidaan kuitenkin aivan hyvin käyttää ** ANSI kutsuja fopen, fgets ja fprintf. Muuta ohjelma ** käyttämään näitä. ** ** 2) Tämä ohjelma ei toimi leikekirjan ja tiedoston käsittelyn ** osalta, jos laskureita lisätään. Muuta tarvittavat aliohjelmat ** sellaisiksi, että esim. polkupyörien lisäämiseksi ei tarvita ** muuta kuin muutos .RC-tiedostoon ja .h tiedostoon ** #define LASKUREITA 3 ** ** 3) ** ****************************************************************************/ #include /* Tarvitaan kaikissa Windows C-ohjelmissa */ #include #include #include #include "tabhand.h" #include "mdialog.h" #include "filename.h" #include "clipboard.h" #include "..\menu2\laskurm2.h" #define WTITLE "Laskuri" TblDlgMAIN("PIKA","LASKURI",MsgTbl); /* Tämä voi olla myös alussa! */ static int laskurit[LASKUREITA] = {0,0}; static int suunta = 1; /***************************************************************************/ int ShowStatic(HWND hWnd, int id, int value) /* Aliohjelmalla tulostetaan Static ikkunaan numero */ { char s[20]; wsprintf(s,"%d ",value); SetDlgItemText(hWnd,id,s); return 0; } /***************************************************************************/ static int nollaa_laskurit(HWND hWnd,int laskurit[]) { int i; for (i=0; iName,&OfStruct,OF_CREATE); if ( hFile == HFILE_ERROR ) goto error; s = laskurit_tekstiksi((int *)File->data); count = strlen(s); n = _lwrite(hFile,s,count); _lclose(hFile); if ( n == count ) return 0; error: MessageBox(File->hWnd,File->Name,"Talletus epäonnistui", MB_APPLMODAL | MB_OK | MB_ICONEXCLAMATION); return -1; } /*-------------------------------------------------------------------------*/ static int MyRead(FileType *File) { static OFSTRUCT OfStruct; HFILE hFile = OpenFile(File->Name,&OfStruct,OF_READ); int n; static char s[128]; if ( hFile == HFILE_ERROR ) goto error; n = _lread(hFile,s,sizeof(s)); _lclose(hFile); teksti_laskureiksi(File->hWnd,s,(int *)File->data); if ( n > 0 ) return 0; error: MessageBox(File->hWnd,File->Name,"Lukeminen epäonnistui", MB_APPLMODAL | MB_OK | MB_ICONEXCLAMATION); return -1; } /*-------------------------------------------------------------------------*/ static int MyNew(FileType *File) { nollaa_laskurit(File->hWnd,(int *)File->data); return 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 dataan */ }; /***************************************************************************/ static int laskurit_leikekirjaan(HWND hWnd,int *laskurit) { char *pText = laskurit_tekstiksi(laskurit); return TextToClipboard(hWnd,pText); } /***************************************************************************/ static int leikekirja_laskureihin(HWND hWnd,int *laskurit) { char *pText = TextClipboard(hWnd); if ( !pText ) return -1; teksti_laskureiksi(hWnd,pText,laskurit); return 0; } /***************************************************************************/ /* Tapahtumien käsittelijät: */ /***************************************************************************/ static EVENT lisaa(tMSGParam *msg) { ShowStatic(msg->hWnd,msg->id-HA+HAL,laskurit[msg->id-HA]+=suunta); return Changed(&File); /* HUOM! ^^^^^^^^^ */ } static EVENT nollaa(tMSGParam *msg) { nollaa_laskurit(msg->hWnd,laskurit); return Changed(&File); } static EVENT lopeta(tMSGParam *msg) { WritePrivateProfileString(WTITLE,WTITLE, laskurit_tekstiksi(laskurit),WTITLE".INI"); if ( NewFile(msg->hWnd,&File) == 0 ) PostQuitMessage(0); 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]; GetPrivateProfileString(WTITLE,WTITLE,"",s,sizeof(s),WTITLE".INI"); teksti_laskureiksi(msg->hWnd,s,laskurit); return 0; } /*-------------------------------------------------------------------------*/ /* FILE */ static EVENT WM_command_IDM_FILE_NEW(tMSGParam *msg) { return NewFile(msg->hWnd,&File); } static EVENT WM_command_IDM_FILE_OPEN(tMSGParam *msg) { return OpenAndReadFile(msg->hWnd,&File);; } static EVENT WM_command_IDM_FILE_SAVEAS(tMSGParam *msg) { return SaveFileAs(msg->hWnd,&File); } static EVENT WM_command_IDM_FILE_SAVE(tMSGParam *msg) { return SaveFile(msg->hWnd,&File); } /*-------------------------------------------------------------------------*/ /* EDIT */ static EVENT WM_command_IDM_EDIT_CUT(tMSGParam *msg) { laskurit_leikekirjaan(msg->hWnd,laskurit); return nollaa_laskurit(msg->hWnd,laskurit); } static EVENT WM_command_IDM_EDIT_COPY(tMSGParam *msg) { return laskurit_leikekirjaan(msg->hWnd,laskurit); } static EVENT WM_command_IDM_EDIT_PASTE(tMSGParam *msg) { 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[] = { { WM_COMMAND , TRANGE , DoC, lisaa , 0 , 0, HA,HA+LASKUREITA-1}, { WM_COMMAND , NOLLAA , DoC, nollaa , 0 , 0}, { WM_COMMAND , IDM_FILE_EXIT , DoC, lopeta , 0 , 0}, { WM_COMMAND , IDCANCEL , DoC, lopeta , 0 , 0}, { WM_COMMAND , EXIT , DoC, lopeta , 0 , 0}, { 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 } };