/**************/ /* scalin3.c */ /**************************************************************************** PROGRAM: scalin3.c PURPOSE: Vaihtaa matkoja Huolehditaan scaling-dialogin käsittelystä. Dialogien tiedot talletetaan vain dialogin ikkunoissa (Edit-kentissä ja nappuloissa) => samasta dialogista voi olla useita esiintymiä. Tämä tapa toimii ainoastaan erikoistapauksissa. Makroilla, jotka vastaavat scaling.c:n staattisia muuttujia, on pyritty saamaan ohjelma säilymään mahdollisimman alkuperäisenä. Melkein suurin muutos tulee dialogin alustukseen, jossa "muuttujille" ei voi sijoittaa arvoja, vaan arvot pitää laittaa suoraan dialogin edit-ikkunoihin jne. HUOM! Nappuloiden arvon muutos on voitu jättää käsittelemättä, koska niiden arvo otetaan joka kerta erikseen makrolla change_other ****************************************************************************/ #include #include "portable.h" #include "mdialog.h" #include "showdoub.h" #include "tabhand.h" #include "vaihtaja.h" /***************************************************************************/ 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 #define H(id) GetDlgItem(msg->hWnd,id) #define SEND_COMMAND(id) SEND_WM_COMMAND(msg->hWnd,id,GetDlgItem(msg->hWnd,id),0) /***************************************************************************/ double dmax(double a, double b) /* Ei makrona, koska tällöin laskut tulee moneen kertaan! */ { return ( a > b ? a : b ); } #define map_unit ComboBox_GetCurSel(H(ID_MAP_UNIT)) #define map_dist GetDouble(msg->hWnd,ID_MAP_DIST,0) #define out_unit ComboBox_GetCurSel(H(ID_OUT_UNIT)) #define out_dist GetDouble(msg->hWnd,ID_OUT_DIST,0) #define scale dmax(GetDouble(msg->hWnd,ID_SCALE,1),1) #define change_other Button_GetCheck(H(IDR_OTHER)) /***************************************************************************/ static EVENT WM_initdialog(tMSGParam *msg) { int i; HWND hCBMapU = GetDlgItem(msg->hWnd,ID_MAP_UNIT); HWND hCBOutU = GetDlgItem(msg->hWnd,ID_OUT_UNIT); for (i=0; units[i].unit; i++) { /* Täytetään combo-listat */ (void)ComboBox_InsertString(hCBMapU,i,units[i].unit); (void)ComboBox_InsertString(hCBOutU,i,units[i].unit); } (void)ComboBox_SetCurSel(hCBMapU,MM); /* oletus yks */ (void)ComboBox_SetCurSel(hCBOutU,KM); /* oletus yks */ (void)Button_SetCheck(H(IDR_OTHER),TRUE); /* oletus muut */ ShowDouble(msg->hWnd,ID_SCALE,200000.0); ShowDouble(msg->hWnd,ID_MAP_DIST,10.0); ShowDouble(msg->hWnd,ID_OUT_DIST,2.0); return TRUE; } static EVENT WM_command_DO_SHOW_OUT(tMSGParam *msg) { return ShowDouble(msg->hWnd,ID_OUT_DIST, map_dist*units[map_unit].mm*scale/units[out_unit].mm); } static EVENT WM_command_DO_SHOW_MAP(tMSGParam *msg) { return ShowDouble(msg->hWnd,ID_MAP_DIST, out_dist/(units[map_unit].mm*scale/units[out_unit].mm)); } static EVENT WM_command_ID_SCALE__EN_CHANGE(tMSGParam *msg) { ShowDouble(msg->hWnd,ID_SCALE,scale); /* Jotta MAX(1,?) tulee tehtyä! */ return SEND_COMMAND(DO_SHOW_OUT); } static EVENT WM_command_ID_MAP_DIST__EN_CHANGE(tMSGParam *msg) { return SEND_COMMAND(DO_SHOW_OUT); } static EVENT WM_command_ID_OUT_DIST__EN_CHANGE(tMSGParam *msg) { return SEND_COMMAND(DO_SHOW_MAP); } static EVENT WM_command_ID_MAP_UNIT__CBN_SELCHANGE(tMSGParam *msg) { return SEND_COMMAND(change_other ? DO_SHOW_OUT : DO_SHOW_MAP); } static EVENT WM_command_ID_OUT_UNIT__CBN_SELCHANGE(tMSGParam *msg) { return SEND_COMMAND(change_other ? DO_SHOW_MAP : DO_SHOW_OUT); } static EVENT WM_command_IDOK(tMSGParam *msg) { SetFocus(H(ID_MAP_DIST)); Edit_SetSel(H(ID_MAP_DIST),0,-1); return 0; } static EVENT WM_command_IDCANCEL(tMSGParam *msg) { return DestroyDialog(msg->hWnd, TRUE); } /***************************************************************************/ tMSGEntry ScalingMsgTbl[] = { { WM_INITDIALOG , DoC , DoC, WM_initdialog }, /*a*/ { WM_COMMAND , DO_SHOW_OUT , DoC, WM_command_DO_SHOW_OUT }, /*a*/ { WM_COMMAND , DO_SHOW_MAP , DoC, WM_command_DO_SHOW_MAP }, /*a*/ { WM_COMMAND , ID_SCALE , EN_CHANGE, WM_command_ID_SCALE__EN_CHANGE }, /*a*/ { WM_COMMAND , ID_MAP_DIST , EN_CHANGE, WM_command_ID_MAP_DIST__EN_CHANGE }, /*a*/ { WM_COMMAND , ID_OUT_DIST , EN_CHANGE, WM_command_ID_OUT_DIST__EN_CHANGE }, /*a*/ { WM_COMMAND , ID_MAP_UNIT , CBN_SELCHANGE, WM_command_ID_MAP_UNIT__CBN_SELCHANGE }, /*a*/ { WM_COMMAND , ID_OUT_UNIT , CBN_SELCHANGE, WM_command_ID_OUT_UNIT__CBN_SELCHANGE }, /*a*/ { WM_COMMAND , IDOK , DoC, WM_command_IDOK }, /*a*/ { WM_COMMAND , IDCANCEL , DoC, WM_command_IDCANCEL }, /*a*/ { 0 } }; /***************************************************************************/