/***************************************************************************** * * diqvcal.c * * VList plug-in that does calibrations. * *****************************************************************************/ #include "diquick.h" #pragma BEGIN_CONST_DATA /***************************************************************************** * * VLISTCAL * * range-specific goo. * *****************************************************************************/ typedef struct VLISTCAL { VLISTITEM item; DIPROPCAL dical; int iRadix; /* * If non-NULL, then this is a read/write control. */ PROPUPDATEPROC Update; PV pvRef1; PV pvRef2; } VLISTCAL, *PVLISTCAL; /***************************************************************************** * * VCal_InitUD * * Common updown initialization goo. * *****************************************************************************/ void INTERNAL VCal_InitUD(HWND hwndUD, PVLISTCAL pvcal, int iValue) { ShowWindow(hwndUD, pvcal->Update ? SW_SHOW : SW_HIDE); UpDown_SetRange(hwndUD, 0x80000000, 0x7FFFFFFF); UpDown_SetPos(hwndUD, pvcal->iRadix, iValue); Edit_SetReadOnly(GetWindow(hwndUD, GW_HWNDPREV), !pvcal->Update); } /***************************************************************************** * * VCal_PreDisplay * * Set the edit control text and let the dialog know who it is in * charge of. * *****************************************************************************/ void INTERNAL VCal_PreDisplay(HWND hdlg, PV pv) { PVLISTCAL pvcal = pv; HWND hwndUD; hwndUD = GetDlgItem(hdlg, IDC_VCAL_MINUD); VCal_InitUD(hwndUD, pvcal, pvcal->dical.lMin); hwndUD = GetDlgItem(hdlg, IDC_VCAL_CTRUD); VCal_InitUD(hwndUD, pvcal, pvcal->dical.lCenter); hwndUD = GetDlgItem(hdlg, IDC_VCAL_MAXUD); VCal_InitUD(hwndUD, pvcal, pvcal->dical.lMax); ShowWindow(GetDlgItem(hdlg, IDC_VCAL_APPLY), pvcal->Update ? SW_SHOW : SW_HIDE); CheckRadioButton(hdlg, IDC_VCAL_DEC, IDC_VCAL_HEX, pvcal->iRadix == 10 ? IDC_VCAL_DEC : IDC_VCAL_HEX); SetDialogPtr(hdlg, pvcal); } /***************************************************************************** * * VCal_Destroy * * Nothing to clean up. * *****************************************************************************/ void INTERNAL VCal_Destroy(PV pv) { PVLISTCAL pvcal = pv; } /***************************************************************************** * * VCal_OnInitDialog * * Limit the strings to MAX_PATH characters. * *****************************************************************************/ BOOL INTERNAL VCal_OnInitDialog(HWND hdlg) { HWND hwndEdit; hwndEdit = GetDlgItem(hdlg, IDC_VCAL_MIN); Edit_LimitText(hwndEdit, CCHMAXINT); hwndEdit = GetDlgItem(hdlg, IDC_VCAL_CTR); Edit_LimitText(hwndEdit, CCHMAXINT); hwndEdit = GetDlgItem(hdlg, IDC_VCAL_MAX); Edit_LimitText(hwndEdit, CCHMAXINT); return TRUE; } /***************************************************************************** * * VCal_OnApply * * Read the value (tricky if hex mode) and call the Update. * *****************************************************************************/ void INLINE VCal_OnApply(HWND hdlg, PVLISTCAL pvcal) { pvcal->Update(&pvcal->dical.diph, pvcal->pvRef1, pvcal->pvRef2); } /***************************************************************************** * * VCal_GetValue * *****************************************************************************/ void INTERNAL VCal_GetValue(HWND hdlg, PVLISTCAL pvcal) { HWND hwndUD; hwndUD = GetDlgItem(hdlg, IDC_VCAL_MINUD); UpDown_GetPos(hwndUD, &pvcal->dical.lMin); hwndUD = GetDlgItem(hdlg, IDC_VCAL_CTRUD); UpDown_GetPos(hwndUD, &pvcal->dical.lCenter); hwndUD = GetDlgItem(hdlg, IDC_VCAL_MAXUD); UpDown_GetPos(hwndUD, &pvcal->dical.lMax); } /***************************************************************************** * * VCal_SetValue * *****************************************************************************/ void INTERNAL VCal_SetValue(HWND hdlg, PVLISTCAL pvcal) { HWND hwndUD; hwndUD = GetDlgItem(hdlg, IDC_VCAL_MINUD); UpDown_SetPos(hwndUD, pvcal->iRadix, pvcal->dical.lMin); hwndUD = GetDlgItem(hdlg, IDC_VCAL_CTRUD); UpDown_SetPos(hwndUD, pvcal->iRadix, pvcal->dical.lCenter); hwndUD = GetDlgItem(hdlg, IDC_VCAL_MAXUD); UpDown_SetPos(hwndUD, pvcal->iRadix, pvcal->dical.lMax); } /***************************************************************************** * * VCal_SetRadix * * Set a new radix by reading the old value, changing the radix, * and writing out the new value. * *****************************************************************************/ void INTERNAL VCal_SetRadix(HWND hdlg, PVLISTCAL pvcal, int iRadix) { VCal_GetValue(hdlg, pvcal); pvcal->iRadix = iRadix; VCal_SetValue(hdlg, pvcal); } /***************************************************************************** * * VCal_OnCommand * * If they changed the radix, then change it. * * If they pressed Apply, then apply it. * *****************************************************************************/ BOOL INTERNAL VCal_OnCommand(HWND hdlg, int id, UINT codeNotify) { PVLISTCAL pvcal = GetDialogPtr(hdlg); switch (id) { case IDC_VCAL_DEC: VCal_SetRadix(hdlg, pvcal, 10); return TRUE; case IDC_VCAL_HEX: VCal_SetRadix(hdlg, pvcal, 16); return TRUE; case IDC_VCAL_APPLY: VCal_GetValue(hdlg, pvcal); VCal_OnApply(hdlg, pvcal); return TRUE; } return FALSE; } /***************************************************************************** * * VCal_DlgProc * * Nothing really happens here. The real work is done externally. * *****************************************************************************/ INT_PTR CALLBACK VCal_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp) { switch (wm) { case WM_INITDIALOG: return VCal_OnInitDialog(hdlg); case WM_COMMAND: return VCal_OnCommand(hdlg, (int)GET_WM_COMMAND_ID(wp, lp), (UINT)GET_WM_COMMAND_CMD(wp, lp)); } return FALSE; } /***************************************************************************** * * c_vvtblInt * * Our vtbl. * *****************************************************************************/ const VLISTVTBL c_vvtblCal = { VCal_PreDisplay, VCal_Destroy, IDD_VAL_CAL, VCal_DlgProc, }; /***************************************************************************** * * VCal_Create * * Make a vlist item that tracks a DIPROPCAL. * *****************************************************************************/ PVLISTITEM EXTERNAL VCal_Create(LPDIPROPCAL pdical, int iRadix, PROPUPDATEPROC Update, PV pvRef1, PV pvRef2) { PVLISTCAL pvcal = LocalAlloc(LPTR, cbX(VLISTCAL)); if (pvcal) { pvcal->item.pvtbl = &c_vvtblCal; pvcal->dical = *pdical; pvcal->iRadix = iRadix; pvcal->Update = Update; pvcal->pvRef1 = pvRef1; pvcal->pvRef2 = pvRef2; } return (PV)pvcal; }