/***************************************************************************/ typedef struct { char *unit; double mm; } unit_type; static unit_type units[] = { { "mm", 1.0 }, { "cm", 10.0 }, { "dm", 100.0 }, { "m", 1000.0 }, { "km", 1000000.0 }, { "inch", 25.4 }, { "ft", 304.8 }, { "yard", 914.4 }, { "mile", 1609300.0 }, { "NM", 1853200.0 }, { "tuuma(s)", 24.742 }, { "kortteli", 148.45 }, { "jalka(s)", 296.9 }, { "kyynärä", 593.8 }, { "syli", 1781.4 }, { "virsta", 1068800.0 }, { "peninkulma", 10688000.0 }, { NULL, 0.0 } }; #define MM 0 #define KM 4 #define DO_SHOW_OUT 1991 #define DO_SHOW_MAP 1992 /***************************************************************************/ BOOL do_command(HWND hDlg,WPARAM wParam) { SendMessage(hDlg,WM_COMMAND,wParam,0); return TRUE; } /***************************************************************************/ BOOL CALLBACK_E Scaling(HWND hDlg,unsigned message,WPARAM wParam,LPARAM lParam) { #pragma argsused static int map_unit = MM; /* mm */ static double map_dist = 10.0; static int out_unit = KM; /* km */ static double out_dist = 2.0; static double scale = 200000.0; static int change_other = 1; int i; switch (message) { case WM_PAINT: return FALSE; case WM_INITDIALOG: for (i=0; units[i].unit; i++) { /* Täytetään combo-listat */ SendDlgItemMessage(hDlg,ID_MAP_UNIT,CB_INSERTSTRING,i, (LPARAM) ((LPSTR)units[i].unit)); SendDlgItemMessage(hDlg,ID_OUT_UNIT,CB_INSERTSTRING,i, (LPARAM) ((LPSTR)units[i].unit)); } SendDlgItemMessage(hDlg,ID_MAP_UNIT,CB_SETCURSEL,map_unit,0); /* oletus yks */ SendDlgItemMessage(hDlg,ID_OUT_UNIT,CB_SETCURSEL,out_unit,0); /* oletus yks */ SendDlgItemMessage(hDlg,IDR_OTHER,BM_SETCHECK,change_other=1,0);/*oletus muut*/ ShowDouble(hDlg,ID_SCALE,scale); ShowDouble(hDlg,ID_MAP_DIST,map_dist); ShowDouble(hDlg,ID_OUT_DIST,out_dist); return (TRUE); case WM_COMMAND: switch ( wParam ) { case DO_SHOW_OUT: out_dist = map_dist*units[map_unit].mm*scale/units[out_unit].mm; ShowDouble(hDlg,ID_OUT_DIST,out_dist); return TRUE; case DO_SHOW_MAP: map_dist = out_dist/(units[map_unit].mm*scale/units[out_unit].mm); ShowDouble(hDlg,ID_MAP_DIST,map_dist); return TRUE; case ID_SCALE: if ( HIWORD(lParam) == EN_CHANGE ) { scale = GetDouble(hDlg,wParam); if ( scale <=0 ) scale = 1; return do_command(hDlg,DO_SHOW_OUT); } break; case ID_MAP_DIST: if ( HIWORD(lParam) == EN_CHANGE ) { map_dist = GetDouble(hDlg,wParam); return do_command(hDlg,DO_SHOW_OUT); } break; case ID_OUT_DIST: if ( HIWORD(lParam) == EN_CHANGE ) { out_dist = GetDouble(hDlg,wParam); return do_command(hDlg,DO_SHOW_MAP); } break; case ID_MAP_UNIT: if ( HIWORD(lParam) == CBN_SELCHANGE ) { map_unit = (int)SendDlgItemMessage(hDlg,ID_MAP_UNIT,CB_GETCURSEL,0,0); if ( change_other ) return do_command(hDlg,DO_SHOW_OUT); return do_command(hDlg,DO_SHOW_MAP); } break; case ID_OUT_UNIT: if ( HIWORD(lParam) == CBN_SELCHANGE ) { out_unit = (int)SendDlgItemMessage(hDlg,ID_OUT_UNIT,CB_GETCURSEL,0,0); if ( change_other ) return do_command(hDlg,DO_SHOW_MAP); return do_command(hDlg,DO_SHOW_OUT); } break; case IDR_THIS: change_other = 0; return TRUE; case IDR_OTHER: change_other = 1; return FALSE; case IDOK: SetFocus(GetDlgItem(hDlg,ID_MAP_DIST)); SendDlgItemMessage(hDlg,ID_MAP_DIST,EM_SETSEL,0,MAKELONG(0,-1)); return TRUE; case IDCANCEL: DestroyDialog(hDlg, TRUE); return (TRUE); default: break; } break; } return (FALSE); }