/**************/ /* vaihtaja.c */ /**************************************************************************** PROGRAM: vaihtaja.c PURPOSE: Vaihtaa rahaa ja matkoja Ohjelmalla esitellään omatekoisten dialog boxien käyttöä. Pääikkuna tekee vain menun, jolla voidaan valita mikä dialog box tulee aktiiviseksi Skaalausvaihtajan oletusikkunana on luonnosta mitattu matka. Painamalla ENTER (IDOK) päästään aina tähän ikkunaan. Kun ikkunaan tullaan, valitaan koko ikkunassa oleva teksti, jotta uuden syöttäminen olisi helpompaa. Ikkunoiden toimintajärjestys on valittu Resource Workshopissa toiminnolla Options - Set order. PROJECT: vaihtaja.c vaihtaja.rc vaihtaja.def TEHTÄVIÄ: 1) Täydennä rahanvaihto toiminto valmiiksi 2) Kokeile muuttaa dialogin oletusjärjetystä (RWSHOP!) 3) Muuta ohjelmaa siten, että tunnetut muunnokset luetaan dialogin käynnistyessä tiedostosta .\SCALING.INI 4) Lisää ohjelmaan lämpötilojen muunnos. Editor: Vesa Lappalainen 26.10.1992 ****************************************************************************/ #include /* Tarvitaan kaikissa Windows C-ohjelmissa */ #include #include #include #include "vaihtaja.h" #define CALLBACK_E CALLBACK _export /* Nyt .DEF tiedosto ei tarvitse EXPORT*/ typedef BOOL CALLBACK (*PDIALOGPROC)(HWND,unsigned,WPARAM,LPARAM); #define WCLASSNAME "WMultiWClass" /***************************************************************************/ #define DestroyDialog(hDlg,retval) EndDialog(hDlg,retval) /***************************************************************************/ LONG DoDialog(HWND hWnd,char *name,PDIALOGPROC func) { LONG ret; HINSTANCE hInstance = (HINSTANCE)GetWindowWord(hWnd,GWW_HINSTANCE); FARPROC lpProcFunc; lpProcFunc = MakeProcInstance((FARPROC)func, hInstance); ret = DialogBox(hInstance, name, hWnd, (DLGPROC)lpProcFunc); FreeProcInstance(lpProcFunc); return ret; } /***************************************************************************/ BOOL CALLBACK_E About(HWND hDlg,unsigned message,WPARAM wParam,LPARAM lParam) { #pragma argsused switch (message) { case WM_INITDIALOG: return (TRUE); case WM_COMMAND: if ( wParam == IDOK || wParam == IDCANCEL ) { EndDialog(hDlg, TRUE); return (TRUE); } break; } return (FALSE); } static char s[100]; /***************************************************************************/ double GetDouble(HWND hDlg,WPARAM id) { double d=0; GetDlgItemText(hDlg,id,s,sizeof(s)); sscanf(s,"%lf",&d); return d; } /***************************************************************************/ void ShowDouble(HWND hDlg,WPARAM id,double d) { double ad,old_d = GetDouble(hDlg,id); ad = fabs(d); if ( fabs(old_d) > ad ) ad = fabs(old_d); if ( fabs(d -old_d) <= ad*0.0000001 ) return; /* Suht virhe isompaan */ sprintf(s,"%-0.9lg",d); SetDlgItemText(hDlg,id,s); } /***************************************************************************/ #include "scaling.c" /***************************************************************************/ BOOL CALLBACK_E Money(HWND hDlg,unsigned message,WPARAM wParam,LPARAM lParam) { #pragma argsused switch (message) { case WM_INITDIALOG: return (TRUE); case WM_COMMAND: if ( wParam == IDOK || wParam == IDCANCEL ) { EndDialog(hDlg, TRUE); return (TRUE); } break; } return (FALSE); } /***************************************************************************/ LRESULT CALLBACK_E MainWndProc(HWND hWnd, unsigned message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; switch (message) { case WM_PAINT: /* Viesti: Piirrä ikkuna uudelleen */ if ( BeginPaint(hWnd,&ps) ) TextOut(ps.hdc, 10, 10, "Hello World!",12); EndPaint(hWnd,&ps); return (NULL); case WM_DESTROY: /* Viesti: ikkuna hävitetään */ PostQuitMessage(0); return (NULL); case WM_COMMAND: switch (wParam) { case IDM_FILE_EXIT: SendMessage(hWnd,WM_DESTROY,0,0); return NULL; case IDM_APP_SCALING: return DoDialog(hWnd,"SCALING",Scaling); case IDM_APP_MONEY: return DoDialog(hWnd,"CHANGE",Money); case IDM_HELP_ABOUT: return DoDialog(hWnd,"About",About); default: break; } break; default: /* Antaa Windowsin käsitellä muut */ break; } return (DefWindowProc(hWnd, message, wParam, lParam)); } /***************************************************************************/ int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { #pragma argsused WNDCLASS wc; /* Ikkunaluokka */ HWND hWnd; /* Pääikkunan kahva */ MSG msg; /* Viesti */ if (!hPrevInstance) { /* Onko muita esiintymiä käynnisssä? */ wc.style = NULL; wc.lpfnWndProc = (WNDPROC)MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, "Ikoni"); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); wc.lpszMenuName = "MAINMENU"; wc.lpszClassName = WCLASSNAME; if (!RegisterClass(&wc)) return (FALSE); } hWnd = CreateWindow(WCLASSNAME,"Vaihtaja",WS_OVERLAPPEDWINDOW, 20,20,400,400, NULL,NULL,hInstance,NULL); if (!hWnd) return (FALSE); ShowWindow(hWnd, nCmdShow); /* Näytetään ikkuna */ UpdateWindow(hWnd); /* Lähetetään WM_PAINT viesti */ while (GetMessage(&msg,NULL,NULL,NULL)) { TranslateMessage(&msg); /* Tulkitaan virtuaaliset näp. koodit */ DispatchMessage(&msg); /* Lähetetään viesti ikkunalle */ } return (msg.wParam); /* Palautetaan PostQuitMessage-funktion arvo */ }