/**************/ /* scalin2.c */ /**************************************************************************** PROGRAM: scalin2.c PURPOSE: Vaihtaa matkoja Huolehditaan scaling-dialogin käsittelystä. Dialogien lokaalin muisti käsittely => samasta dialogista voi olla useita esiintymiä. Vaatii ikkunakahvakohtaisen muistialueen lukituksen ennen ikkunalle kuuluvan muistilohkon käsittelyä. Lukitus hoidetaan tässä makrolla LOCK ja vapautus makrolla UNLOCK ****************************************************************************/ #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) typedef struct { int map_unit; double map_dist; int out_unit; double out_dist; double scale; int change_other; } tLocalStruct, *pLocalStruct; /***************************************************************************/ static int InitScaling(pLocalStruct lp) /* Lokaalin muistialueen alustus */ { 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; return 0; } /***************************************************************************/ static pLocalStruct EventLock(HWND hDlg) { pLocalStruct lp = (pLocalStruct)DialogLock(hDlg); if ( !lp ) { lp = (pLocalStruct)DialogAlloc(hDlg,sizeof(*lp)); if ( !lp ) return NULL; InitScaling(lp); } return lp; } #define LOCK pLocalStruct lp = EventLock(msg->hWnd); if ( !lp ) return NULL; #define UNLOCK return DialogUnlock(msg->hWnd); static EVENT WM_initdialog(tMSGParam *msg) { int i; HWND hCBMapU = GetDlgItem(msg->hWnd,ID_MAP_UNIT); HWND hCBOutU = GetDlgItem(msg->hWnd,ID_OUT_UNIT); LOCK; 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,lp->map_unit); /* oletus yks */ (void)ComboBox_SetCurSel(hCBOutU,lp->out_unit); /* oletus yks */ (void)Button_SetCheck(H(IDR_OTHER),lp->change_other=1); /* oletus muut */ ShowDouble(msg->hWnd,ID_SCALE,lp->scale); ShowDouble(msg->hWnd,ID_MAP_DIST,lp->map_dist); ShowDouble(msg->hWnd,ID_OUT_DIST,lp->out_dist); UNLOCK; } static EVENT WM_command_DO_SHOW_OUT(tMSGParam *msg) { LOCK; lp->out_dist = lp->map_dist*units[lp->map_unit].mm*lp->scale/units[lp->out_unit].mm; ShowDouble(msg->hWnd,ID_OUT_DIST,lp->out_dist); UNLOCK; } static EVENT WM_command_DO_SHOW_MAP(tMSGParam *msg) { LOCK; lp->map_dist = lp->out_dist/(units[lp->map_unit].mm*lp->scale/units[lp->out_unit].mm); ShowDouble(msg->hWnd,ID_MAP_DIST,lp->map_dist); UNLOCK; } static EVENT WM_command_ID_SCALE__EN_CHANGE(tMSGParam *msg) { LOCK; lp->scale = GetDouble(msg->hWnd,msg->wParam,1); if ( lp->scale <=0 ) lp->scale = 1; SEND_COMMAND(DO_SHOW_OUT); UNLOCK; } static EVENT WM_command_ID_MAP_DIST__EN_CHANGE(tMSGParam *msg) { LOCK; lp->map_dist = GetDouble(msg->hWnd,msg->wParam,0); SEND_COMMAND(DO_SHOW_OUT); UNLOCK; } static EVENT WM_command_ID_OUT_DIST__EN_CHANGE(tMSGParam *msg) { LOCK; lp->out_dist = GetDouble(msg->hWnd,msg->wParam,0); SEND_COMMAND(DO_SHOW_MAP); UNLOCK; } static EVENT WM_command_ID_MAP_UNIT__CBN_SELCHANGE(tMSGParam *msg) { LOCK; lp->map_unit = (int)SendDlgItemMessage(msg->hWnd,ID_MAP_UNIT,CB_GETCURSEL,0,0); SEND_COMMAND(lp->change_other ? DO_SHOW_OUT : DO_SHOW_MAP); UNLOCK; } static EVENT WM_command_ID_OUT_UNIT__CBN_SELCHANGE(tMSGParam *msg) { LOCK; lp->out_unit = (int)SendDlgItemMessage(msg->hWnd,ID_OUT_UNIT,CB_GETCURSEL,0,0); SEND_COMMAND(lp->change_other ? DO_SHOW_MAP : DO_SHOW_OUT); UNLOCK; } static EVENT WM_command_IDR_THIS(tMSGParam *msg) { LOCK; lp->change_other = 0; UNLOCK; } static EVENT WM_command_IDR_OTHER(tMSGParam *msg) { LOCK; lp->change_other = 1; UNLOCK; } 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 , IDR_THIS , DoC , WM_command_IDR_THIS }, /*a*/ { WM_COMMAND , IDR_OTHER , DoC , WM_command_IDR_OTHER }, /*a*/ { WM_COMMAND , IDOK , DoC , WM_command_IDOK }, /*a*/ { WM_COMMAND , IDCANCEL , DoC , WM_command_IDCANCEL }, /*a*/ { 0 } }; /***************************************************************************/