/**************/ /* laskurm3.c */ /**************************************************************************** ** PROGRAM: laskurm3.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. ** Editor: Vesa Lappalainen ** Projektiin tarvitaan ** laskurm3.c - tämä tiedosto ** ..\laskurir.def - moduulin määrittely ** ..\menu2\laskurm2.rc - resurssit ** ALI\filename.c - tiedoston nimen yms. käsittely ** ALI\mjonot.c - esim. filename tarvitsee ** ALI\clipboard.c - leikekirjan käsittely ** ** Tehtäviä: 1) ** ** 2) ** ** 3) ** ****************************************************************************/ #include /* Tarvitaan kaikissa Windows C-ohjelmissa */ #include #include #include #include "filename.h" #include "..\menu2\laskurm2.h" #include "clipboard.h" #define WTITLE "Laskuri" #define LASKUREITA 2 static int laskurit[LASKUREITA] = {0,0}; static int suunta = 1; static HICON ikoni; 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. */ }; /***************************************************************************/ char laskuri_teksti[128]; /***************************************************************************/ char *laskurit_tekstiksi(int *laskurit) /* Muutetaan laskureiden arvo tekstiksi */ { sprintf(laskuri_teksti,"%d %d",laskurit[0],laskurit[1]); return laskuri_teksti; } /***************************************************************************/ 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; } /***************************************************************************/ void teksti_laskureiksi(HWND hWnd,char *teksti,int *laskurit) /* Muutetaan teksti laskureiksi */ { int i; sscanf(teksti,"%d %d",&laskurit[0],&laskurit[1]); for (i=0; iName,&OfStruct,OF_CREATE); if ( hFile == HFILE_ERROR ) goto error; s = laskurit_tekstiksi((int *)File->data); count = strlen(s); n = write(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; } /***************************************************************************/ 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 = read(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; } /***************************************************************************/ int MyNew(FileType *File) { nollaa_laskurit(File->hWnd,(int *)File->data); return 0; } /***************************************************************************/ int laskurit_leikekirjaan(HWND hWnd,int *laskurit) { char *pText = laskurit_tekstiksi(laskurit); return TextToClipboard(hWnd,pText); } /***************************************************************************/ int leikekirja_laskureihin(HWND hWnd,int *laskurit) { char *pText = TextClipboard(hWnd); if ( !pText ) return -1; teksti_laskureiksi(hWnd,pText,laskurit); return 0; } /***************************************************************************/ BOOL CALLBACK_E MainWndProc(HWND hWnd, unsigned message, WPARAM wParam, LPARAM lParam) { #pragma argsused HMENU hMenu = GetMenu(hWnd); PAINTSTRUCT ps; static char s[128]; switch (message) { /* Ikoni joudutaan piirtämään itse, koska dialogi luokalla ei ikonia */ case WM_PAINT: if ( IsIconic(hWnd) ) { if ( !BeginPaint(hWnd,&ps) ) break; SelectObject(ps.hdc,GetStockObject(GRAY_BRUSH)); Rectangle(ps.hdc,0,0,40,40); DrawIcon(ps.hdc,2,2,ikoni); EndPaint(hWnd,&ps); return TRUE; } break; case WM_INITDIALOG: /* Luetaan edellisen kerran arvot */ GetPrivateProfileString(WTITLE,WTITLE,"",s,sizeof(s),WTITLE".INI"); teksti_laskureiksi(hWnd,s,laskurit); return TRUE; 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: 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: 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; 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"); ikoni = LoadIcon(hInstance,"IKONI"); hWndL = CreateDialog(hInstance,"LASKURI",NULL,(DLGPROC)lProc); if ( !hWndL ) goto lopetus; /* SetClassWord(hWndL, GCW_HICON, ikoni); VAARALLINEN, ÄLÄ KÄYTÄ */ /* Käyttö muuttaa kaikkein Dialogien ikonin! */ 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 */ } lopetus: (void)FreeProcInstance(lProc); return 0; }