windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/dx8/diquick/diqvrang.c
2020-09-26 16:20:57 +08:00

291 lines
7 KiB
C

/*****************************************************************************
*
* diqvrang.c
*
* VList plug-in that does ranges.
*
*****************************************************************************/
#include "diquick.h"
#pragma BEGIN_CONST_DATA
/*****************************************************************************
*
* VLISTRANGE
*
* range-specific goo.
*
*****************************************************************************/
typedef struct VLISTRANGE {
VLISTITEM item;
DIPROPRANGE diprg;
int iRadix;
/*
* If non-NULL, then this is a read/write control.
*/
PROPUPDATEPROC Update;
PV pvRef1;
PV pvRef2;
} VLISTRANGE, *PVLISTRANGE;
/*****************************************************************************
*
* VRange_InitUD
*
* Common updown initialization goo.
*
*****************************************************************************/
void INTERNAL
VRange_InitUD(HWND hwndUD, PVLISTRANGE pvrg, int iValue)
{
ShowWindow(hwndUD, pvrg->Update ? SW_SHOW : SW_HIDE);
UpDown_SetRange(hwndUD, 0x80000000, 0x7FFFFFFF);
UpDown_SetPos(hwndUD, pvrg->iRadix, iValue);
Edit_SetReadOnly(GetWindow(hwndUD, GW_HWNDPREV), !pvrg->Update);
}
/*****************************************************************************
*
* VRange_PreDisplay
*
* Set the edit control text and let the dialog know who it is in
* charge of.
*
*****************************************************************************/
void INTERNAL
VRange_PreDisplay(HWND hdlg, PV pv)
{
PVLISTRANGE pvrg = pv;
HWND hwndUD;
hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MINUD);
VRange_InitUD(hwndUD, pvrg, pvrg->diprg.lMin);
hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MAXUD);
VRange_InitUD(hwndUD, pvrg, pvrg->diprg.lMax);
ShowWindow(GetDlgItem(hdlg, IDC_VRANGE_APPLY),
pvrg->Update ? SW_SHOW : SW_HIDE);
CheckRadioButton(hdlg, IDC_VRANGE_DEC, IDC_VRANGE_HEX,
pvrg->iRadix == 10 ? IDC_VRANGE_DEC : IDC_VRANGE_HEX);
SetDialogPtr(hdlg, pvrg);
}
/*****************************************************************************
*
* VRange_Destroy
*
* Nothing to clean up.
*
*****************************************************************************/
void INTERNAL
VRange_Destroy(PV pv)
{
PVLISTRANGE pvrg = pv;
}
/*****************************************************************************
*
* VRange_OnInitDialog
*
* Limit the strings to MAX_PATH characters.
*
*****************************************************************************/
BOOL INTERNAL
VRange_OnInitDialog(HWND hdlg)
{
HWND hwndEdit;
hwndEdit = GetDlgItem(hdlg, IDC_VRANGE_MIN);
Edit_LimitText(hwndEdit, CCHMAXINT);
hwndEdit = GetDlgItem(hdlg, IDC_VRANGE_MAX);
Edit_LimitText(hwndEdit, CCHMAXINT);
return TRUE;
}
/*****************************************************************************
*
* VRange_OnApply
*
* Read the value (tricky if hex mode) and call the Update.
*
*****************************************************************************/
void INLINE
VRange_OnApply(HWND hdlg, PVLISTRANGE pvrg)
{
pvrg->Update(&pvrg->diprg.diph, pvrg->pvRef1, pvrg->pvRef2);
}
/*****************************************************************************
*
* VRange_GetValue
*
*****************************************************************************/
void INTERNAL
VRange_GetValue(HWND hdlg, PVLISTRANGE pvrg)
{
HWND hwndUD;
hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MINUD);
UpDown_GetPos(hwndUD, &pvrg->diprg.lMin);
hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MAXUD);
UpDown_GetPos(hwndUD, &pvrg->diprg.lMax);
}
/*****************************************************************************
*
* VRange_SetValue
*
*****************************************************************************/
void INTERNAL
VRange_SetValue(HWND hdlg, PVLISTRANGE pvrg)
{
HWND hwndUD;
hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MINUD);
UpDown_SetPos(hwndUD, pvrg->iRadix, pvrg->diprg.lMin);
hwndUD = GetDlgItem(hdlg, IDC_VRANGE_MAXUD);
UpDown_SetPos(hwndUD, pvrg->iRadix, pvrg->diprg.lMax);
}
/*****************************************************************************
*
* VRange_SetRadix
*
* Set a new radix by reading the old value, changing the radix,
* and writing out the new value.
*
*****************************************************************************/
void INTERNAL
VRange_SetRadix(HWND hdlg, PVLISTRANGE pvrg, int iRadix)
{
VRange_GetValue(hdlg, pvrg);
pvrg->iRadix = iRadix;
VRange_SetValue(hdlg, pvrg);
}
/*****************************************************************************
*
* VRange_OnCommand
*
* If they changed the radix, then change it.
*
* If they pressed Apply, then apply it.
*
*****************************************************************************/
BOOL INTERNAL
VRange_OnCommand(HWND hdlg, int id, UINT codeNotify)
{
PVLISTRANGE pvrg = GetDialogPtr(hdlg);
switch (id) {
case IDC_VRANGE_DEC:
VRange_SetRadix(hdlg, pvrg, 10);
return TRUE;
case IDC_VRANGE_HEX:
VRange_SetRadix(hdlg, pvrg, 16);
return TRUE;
case IDC_VRANGE_APPLY:
VRange_GetValue(hdlg, pvrg);
VRange_OnApply(hdlg, pvrg);
return TRUE;
}
return FALSE;
}
/*****************************************************************************
*
* VRange_DlgProc
*
* Nothing really happens here. The real work is done externally.
*
*****************************************************************************/
INT_PTR CALLBACK
VRange_DlgProc(HWND hdlg, UINT wm, WPARAM wp, LPARAM lp)
{
switch (wm) {
case WM_INITDIALOG:
return VRange_OnInitDialog(hdlg);
case WM_COMMAND:
return VRange_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_vvtblRange = {
VRange_PreDisplay,
VRange_Destroy,
IDD_VAL_RANGE,
VRange_DlgProc,
};
/*****************************************************************************
*
* VRange_Create
*
* Make a vlist item that tracks a string.
*
*****************************************************************************/
PVLISTITEM EXTERNAL
VRange_Create(LPDIPROPRANGE pdiprg, int iRadix,
PROPUPDATEPROC Update, PV pvRef1, PV pvRef2)
{
PVLISTRANGE pvrg = LocalAlloc(LPTR, cbX(VLISTRANGE));
if (pvrg) {
pvrg->item.pvtbl = &c_vvtblRange;
pvrg->diprg = *pdiprg;
pvrg->iRadix = iRadix;
pvrg->Update = Update;
pvrg->pvRef1 = pvRef1;
pvrg->pvRef2 = pvRef2;
}
return (PV)pvrg;
}