/***************************************************************************/ 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; } typedef struct { int map_unit; double map_dist; int out_unit; double out_dist; double scale; int change_other; } tLocalStruct, *pLocalStruct; #define DO_RETURN(ret) { ret_val = ret; goto return_value; } /***************************************************************************/ BOOL CALLBACK_E Scaling(HWND hDlg,unsigned message,WPARAM wParam,LPARAM lParam) { #pragma argsused int i,ret_val; pLocalStruct lp = (pLocalStruct)DialogLock(hDlg); if ( !lp ) { lp = (pLocalStruct)DialogAlloc(hDlg,sizeof(*lp)); if ( !lp ) return FALSE; lp->map_unit = MM; /* mm */ lp->map_dist = 10.0; lp->out_unit = KM; /* km */ lp->out_dist = 2.0; lp->scale = 200000.0; lp->change_other = 1; } switch (message) { case WM_PAINT: DO_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,lp->map_unit,0); /* oletus yks */ SendDlgItemMessage(hDlg,ID_OUT_UNIT,CB_SETCURSEL,lp->out_unit,0); /* oletus yks */ SendDlgItemMessage(hDlg,IDR_OTHER,BM_SETCHECK,lp->change_other=1,0);/*oletus muut*/ ShowDouble(hDlg,ID_SCALE,lp->scale); ShowDouble(hDlg,ID_MAP_DIST,lp->map_dist); ShowDouble(hDlg,ID_OUT_DIST,lp->out_dist); DO_RETURN(TRUE); case WM_COMMAND: switch ( wParam ) { case DO_SHOW_OUT: lp->out_dist = lp->map_dist*units[lp->map_unit].mm*lp->scale/ units[lp->out_unit].mm; ShowDouble(hDlg,ID_OUT_DIST,lp->out_dist); DO_RETURN(TRUE); case DO_SHOW_MAP: lp->map_dist = lp->out_dist/(units[lp->map_unit].mm*lp->scale/ units[lp->out_unit].mm); ShowDouble(hDlg,ID_MAP_DIST,lp->map_dist); DO_RETURN(TRUE); case ID_SCALE: if ( HIWORD(lParam) == EN_CHANGE ) { lp->scale = GetDouble(hDlg,wParam); if ( lp->scale <=0 ) lp->scale = 1; DO_RETURN( do_command(hDlg,DO_SHOW_OUT) ); } break; case ID_MAP_DIST: if ( HIWORD(lParam) == EN_CHANGE ) { lp->map_dist = GetDouble(hDlg,wParam); DO_RETURN( do_command(hDlg,DO_SHOW_OUT) ); } break; case ID_OUT_DIST: if ( HIWORD(lParam) == EN_CHANGE ) { lp->out_dist = GetDouble(hDlg,wParam); DO_RETURN( do_command(hDlg,DO_SHOW_MAP) ); } break; case ID_MAP_UNIT: if ( HIWORD(lParam) == CBN_SELCHANGE ) { lp->map_unit = (int)SendDlgItemMessage(hDlg,ID_MAP_UNIT,CB_GETCURSEL,0,0); if ( lp->change_other ) DO_RETURN( do_command(hDlg,DO_SHOW_OUT) ); DO_RETURN( do_command(hDlg,DO_SHOW_MAP) ); } break; case ID_OUT_UNIT: if ( HIWORD(lParam) == CBN_SELCHANGE ) { lp->out_unit = (int)SendDlgItemMessage(hDlg,ID_OUT_UNIT,CB_GETCURSEL,0,0); if ( lp->change_other ) DO_RETURN( do_command(hDlg,DO_SHOW_MAP) ); DO_RETURN( do_command(hDlg,DO_SHOW_OUT) ); } break; case IDR_THIS: lp->change_other = 0; DO_RETURN(TRUE); case IDR_OTHER: lp->change_other = 1; DO_RETURN(TRUE); case IDOK: SetFocus(GetDlgItem(hDlg,ID_MAP_DIST)); SendDlgItemMessage(hDlg,ID_MAP_DIST,EM_SETSEL,0,MAKELONG(0,-1)); DO_RETURN(TRUE); case IDCANCEL: DestroyDialog(hDlg, TRUE); DO_RETURN(TRUE); default: break; } break; } DO_RETURN(FALSE); return_value: DialogUnlock(hDlg); return ret_val; }