Windows2003-3790/multimedia/directx/dinput/dimapcfg/dimaptst.cpp
2020-09-30 16:53:55 +02:00

1057 lines
31 KiB
C++

//===========================================================================
// dimaptst.cpp
//
// DirectInput Mapper test tool
//
// Build options:
// Internal Test Tool
// -DINTERNAL -DTESTAPP
//
// External DDK Configuration Tool
// -DDDKAPP
//
// Functions:
// WinMain
// dimaptstMainDlgProc
// dimaptstOnInitDialog
// dimaptstOnClose
// dimaptstOnCommand
// dimaptstOnUpdateControlData
// dmtGetCheckedRadioButton
//
// History:
// 08/19/1999 - davidkl - created
//===========================================================================
#define INITGUID
#include "dimaptst.h"
#include "dmtabout.h"
#include "dmtinput.h"
#include "dmtcfg.h"
#include "dmttest.h"
//#include "dmtwrite.h"
#include "dmtstress.h"
//---------------------------------------------------------------------------
#ifndef NTAPI
#define NTAPI __stdcall
#endif
#ifndef NTSYSAPI
#define NTSYSAPI __declspec(dllimport)
#endif
#ifndef NTSTATUS
typedef LONG NTSTATUS;
#endif
#ifndef PCSZ
typedef CONST char *PCSZ;
#endif
extern "C"
{
NTSYSAPI NTSTATUS NTAPI RtlCharToInteger(PCSZ szString,
ULONG ulBase,
ULONG *puValue);
NTSYSAPI ULONG NTAPI RtlNtStatusToDosError(NTSTATUS nts);
}
//---------------------------------------------------------------------------
// app global variables
HINSTANCE ghinst = NULL;
HANDLE ghEvent = NULL;
CRITICAL_SECTION gcritsect;
//---------------------------------------------------------------------------
// file global variables
//---------------------------------------------------------------------------
//===========================================================================
// WinMain
//
// App entry point
//
// Parameters: (see SDK help for parameter details)
// HINSTANCE hinst
// HINSTANCE hinstPrev
// LPSTR szCmdParams
// int nShow
//
// Returns: (see SDK help for return value details)
// int
//
// History:
// 08/19/1999 - davidkl - created
//===========================================================================
int WINAPI WinMain(HINSTANCE hinst,
HINSTANCE hinstPrev,
PSTR szCmdParams,
int nShow)
{
//int n = 0;
//JJ 64Bit Compat
INT_PTR n = 0;
// initialize DPF
DbgInitialize(TRUE);
DbgEnable(TRUE);
// see if our ini file exists
n = GetPrivateProfileIntA("0",
"AI0",
0,
GENRES_INI);
if(0 == n)
{
// file does not exist
//
// inform user and bail
MessageBoxA(NULL,
"Please copy genre.ini to the current folder.",
"Unable to locate genre.ini",
MB_OK);
return FALSE;
}
// initialize Win9x common controls (progress bars, etc)
InitCommonControls();
// intialize COM
if(FAILED(CoInitialize(NULL)))
{
DPF(0, "COM initialization failed... exiting");
return -1;
}
// save our instance handle
ghinst = hinst;
// create our critical section
InitializeCriticalSection(&gcritsect);
// create our signal event
ghEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
// create our main dialog window
n = DialogBoxParamA(hinst,
MAKEINTRESOURCEA(IDD_MAIN),
(HWND)NULL,
dimaptstMainDlgProc,
(LPARAM)NULL);
if(-1 == n)
{
DPF(0, "WinMain - DialogBoxParamA returned an error (%d)",
GetLastError());
}
// done
CloseHandle(ghEvent);
DeleteCriticalSection(&gcritsect);
CoUninitialize();
return (int)n;
} //*** end WinMain()
//===========================================================================
// dimaptstMainDlgProc
//
// Main application dialog processing function
//
// Parameters: (see SDK help for parameter details)
// HWND hwnd
// UINT uMsg
// WPARAM wparam
// LPARAM lparam
//
// Returns: (see SDK help for return value details)
// BOOL
//
// History:
// 08/19/1999 - davidkl - created
//===========================================================================
/*BOOL*/INT_PTR CALLBACK dimaptstMainDlgProc(HWND hwnd,
UINT uMsg,
WPARAM wparam,
LPARAM lparam)
{
switch(uMsg)
{
case WM_INITDIALOG:
return dimaptstOnInitDialog(hwnd,
(HWND)wparam,
lparam);
case WM_CLOSE:
return dimaptstOnClose(hwnd);
case WM_COMMAND:
return dimaptstOnCommand(hwnd,
LOWORD(wparam),
(HWND)lparam,
HIWORD(wparam));
//JJ Comment: I am keeping the timer stuff around for now while getting rid of
//input polling because we are going to use it later in a different way; I will
//leave the timer stuff in for now and then add in the input stuff when more specific
//decisions are made concerning *what* exact performance/implementation is desired.
case WM_TIMER:
return dimaptstOnTimer(hwnd,
wparam);
case WM_DMT_UPDATE_LISTS:
return dimaptstOnUpdateLists(hwnd);
}
return FALSE;
}
//===========================================================================
// dimaptstOnInitDialog
//
// Handle WM_INITDIALOG processing for the main dialogfs
//
// Parameters:
//
// Returns: BOOL
//
// History:
// 08/20/1999 - davidkl - created
//===========================================================================
BOOL dimaptstOnInitDialog(HWND hwnd,
HWND hwndFocus,
LPARAM lparam)
{
HRESULT hRes = S_OK;
/*int*/
//JJ 64Bit Compat
UINT_PTR nIdx = 0;
//LONG lPrev = 0L;
//JJ 64Bit Compat
LONG_PTR lPrev = 0;
DMT_APPINFO *pdmtai = NULL;
DMTGENRE_NODE *pNode = NULL;
DPF(5, "dimaptstOnInitDialog");
// give the system menu our icon
SendMessageA(hwnd,
WM_SETICON,
ICON_BIG,
(LPARAM)LoadIcon(ghinst,
MAKEINTRESOURCEA(IDI_DIMAPTST)));
SendMessageA(hwnd,
WM_SETICON,
ICON_SMALL,
(LPARAM)LoadIcon(ghinst,
MAKEINTRESOURCEA(IDI_DIMAPTST)));
// allocate the appinfo structure
pdmtai = (DMT_APPINFO*)LocalAlloc(LMEM_FIXED,
sizeof(DMT_APPINFO));
if(!pdmtai)
{
// serious app problem.
// we need to stop things right here and now
DPF(0, "dimaptstOnInitDialog - This is bad... "
"We failed to allocate appinfo");
DPF(0, "dimaptstOnInitDialog - Please find someone "
"to look at this right away");
DebugBreak();
return FALSE;
}
pdmtai->pGenreList = NULL;
pdmtai->pSubGenre = NULL;
pdmtai->pDeviceList = NULL;
pdmtai->fStartWithDefaults = FALSE;
// allocate the genre list
hRes = dmtcfgCreateGenreList(&(pdmtai->pGenreList));
if(FAILED(hRes))
{
// this is potentially very bad
// ISSUE-2001/03/29-Marcand we fault if we hit this
// really need to kill the app at this point
DPF(0, "dimaptstOnInitDialog - This is bad... "
"We failed to create genre list "
"(%s == %08Xh)",
dmtxlatHRESULT(hRes), hRes);
DPF(0, "dimaptstOnInitDialog - Check to be sure that %s "
" exists in the current directory",
GENRES_INI);
return FALSE;
}
// set the hwnd userdata
SetLastError(0);
//JJ- 64Bit compat change
lPrev = SetWindowLongPtr(hwnd,
GWLP_USERDATA,
(LONG_PTR)pdmtai);
if(!lPrev && GetLastError())
{
// serious app problem.
// we need to stop things right here and now
DPF(0, "dimaptstOnInitDialog - This is bad... "
"We failed to store pList");
DPF(0, "dimaptstOnInitDialog - Please find someone "
"to look at this right away");
DebugBreak();
return FALSE;
}
// populate the controls
// genre list
pNode = pdmtai->pGenreList;
while(pNode)
{
// add the name to the list
nIdx = SendMessageA((HWND)GetDlgItem(hwnd, IDC_DEVICE_GENRES),
CB_ADDSTRING,
0,
(LPARAM)(pNode->szName));
// add the node to the item data
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
CB_SETITEMDATA,
nIdx,
(LPARAM)pNode);
// next node
pNode = pNode->pNext;
}
// set the selection to the first in the list
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
CB_SETCURSEL,
0,
0L);
// populate the subgenre list
SendMessageA(hwnd,
WM_DMT_UPDATE_LISTS,
0,
0L);
// set the testing option
// CheckRadioButton(hwnd,
// IDC_USE_INTEGRATED,
// IDC_USE_CPL,
// IDC_USE_CPL);
#ifdef TESTAPP
//***************************************
// Internal app specific control settings
//***************************************
// set the verification option to automatic
CheckRadioButton(hwnd,
IDC_VERIFY_AUTOMATIC,
IDC_VERIFY_MANUAL,
IDC_VERIFY_AUTOMATIC);
#endif // TESTAPP
#ifdef DDKAPP
//***************************************
// DDK Tool specific control settings
//***************************************
// set default state for "start with defaults"
CheckDlgButton(hwnd,
IDC_START_WITH_DEFAULTS,
BST_CHECKED);
#endif // DDKAPP
SendMessageA(hwnd,
WM_COMMAND,
IDC_ENUM_DEVICES,
0L);
// done
return TRUE;
} //*** end dimaptstOnInitDialog()
//===========================================================================
// dimaptstOnClose
//
// Handle WM_CLOSE processing for the main dialog
//
// Parameters:
//
// Returns: BOOL
//
// History:
// 08/20/1999 - davidkl - created
//===========================================================================
BOOL dimaptstOnClose(HWND hwnd)
{
HRESULT hRes = S_OK;
HRESULT hr = S_OK;
DMT_APPINFO *pdmtai = NULL;
DPF(5, "dimaptstOnClose");
__try
{
// get appinfo
//JJ- 64Bit Compat
pdmtai = (DMT_APPINFO*)GetWindowLongPtr(hwnd,
GWLP_USERDATA);
if(!pdmtai)
{
DPF(0, "dimaptstOnClose - unable to retrieve app info");
hRes = E_UNEXPECTED;
__leave;
}
// free appinfo
// device list first
hr = dmtinputFreeDeviceList(&(pdmtai->pDeviceList));
if(S_OK == hRes)
{
DPF(2, "dimaptstOnClose - dmtinputFreeDeviceList (%s == %08Xh)",
dmtxlatHRESULT(hr), hr);
hRes = hr;
}
pdmtai->pDeviceList = NULL;
// then genre list
hRes = dmtcfgFreeGenreList(&(pdmtai->pGenreList));
if(S_OK == hRes)
{
DPF(2, "dimaptstOnClose - dmtinputFreeGenreList (%s == %08Xh)",
dmtxlatHRESULT(hr), hr);
hRes = hr;
}
pdmtai->pGenreList = NULL;
// parent structure
if(LocalFree((HLOCAL)pdmtai))
{
DPF(0, "dimaptstOnClose - LocalFree(app info) failed!");
if(S_OK == hRes)
{
hRes = DMT_S_MEMORYLEAK;
}
}
pdmtai = NULL;
}
_finally
{
// time to leave
EndDialog(hwnd, (int)hRes);
PostQuitMessage((int)hRes);
}
// done
return FALSE;
} //*** end dimaptstOnClose()
//===========================================================================
// dimaptstOnCommand
//
// Handle WM_COMMAND processing for the main dialog
//
// Parameters:
//
// Returns: BOOL
//
// History:
// 08/20/1999 - davidkl - created
//===========================================================================
BOOL dimaptstOnCommand(HWND hwnd,
WORD wId,
HWND hwndCtrl,
WORD wNotifyCode)
{
HRESULT hRes = S_OK;
BOOL fEnable = FALSE;
BOOL fEnumSuitable = FALSE;
//JJ Added 64Bit Compat
LONG_PTR nIdx = -1;
UINT_PTR u = 0;
static UINT_PTR uGenSel = 0;
static UINT uSubSel = 0;
DMT_APPINFO *pdmtai = NULL;
DMTDEVICE_NODE *pDevice = NULL;
DMTGENRE_NODE *pGenre = NULL;
DMTSUBGENRE_NODE *pSubGenre = NULL;
#ifdef TESTAPP
int nWidth = 597;
int nHeight = 0;
#endif // TESTAPP
DPF(5, "dimaptstOnCommand");
// get app info (stored in hwnd userdata)
//JJ- 64Bit Compat
pdmtai = (DMT_APPINFO*)GetWindowLongPtr(hwnd,
GWLP_USERDATA);
if(!pdmtai)
{
// ISSUE-2001/03/29-timgill Needs error case handling
}
switch(wId)
{
case IDOK:
//JJ FIX UI
hRes = dmttestRunMapperCPL(hwnd,
FALSE);
break;
case IDCANCEL:
// ISSUE-2001/03/29-timgill need to check return value
dmttestStopIntegrated(hwnd);
break;
case IDC_DEVICE_GENRES:
// check for selection change
if(CBN_DROPDOWN == wNotifyCode)
{
// memorize current selection
uGenSel = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
CB_GETCURSEL,
0,
//JJ- 64Bit Compat
//0L);
0);
}
if(CBN_SELCHANGE == wNotifyCode)
{
// selection changed
//
// get the new selection
u = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
CB_GETCURSEL,
0,
0L);
if(uGenSel != u)
{
SendMessageA(hwnd,
WM_DMT_UPDATE_LISTS,
0,
0L);
}
}
break;
case IDC_SUBGENRES:
#ifndef DDKAPP
// check for selection change
if(CBN_DROPDOWN == wNotifyCode)
{
// memorize current selection
uSubSel = SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
CB_GETCURSEL,
0,
0L);
}
if(CBN_SELCHANGE == wNotifyCode)
{
// selection changed
//
// get the new selection
u = SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
CB_GETCURSEL,
0,
0L);
if(uSubSel != u)
{
// clear the device combo box
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
CB_RESETCONTENT,
0,
0L);
// release device list
dmtinputFreeDeviceList(&(pdmtai->pDeviceList));
// release the mapping lists for each subgenre
dmtcfgFreeAllMappingLists(pdmtai->pGenreList);
// disable appropriate controls
dimaptstPostEnumEnable(hwnd, FALSE);
}
}
#endif
break;
case IDC_ENUM_DEVICES:
// ISSUE-2001/03/29-timgill Long conditional branch
// should really make a sep. fn
/*
#ifdef DDKAPP
// we only want to enumerate all gaming
// devices if we are the DDK tool
fEnumSuitable = FALSE;
#else
*/
fEnumSuitable = TRUE;
u = SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
CB_GETCURSEL,
0,
0L);
pSubGenre = (DMTSUBGENRE_NODE*)SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
CB_GETITEMDATA,
u,
0L);
if(!pSubGenre)
{
// ISSUE-2001/03/29-timgill Needs error case handling
}
//#endif
// first, free the existing device list
hRes = dmtinputFreeDeviceList(&(pdmtai->pDeviceList));
if(FAILED(hRes))
{
// ISSUE-2001/03/29-timgill Needs error case handling
}
// then, flush the combo box
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
CB_RESETCONTENT,
0,
0L);
// now, re-create the device list
hRes = dmtinputCreateDeviceList(hwnd,
fEnumSuitable,
pSubGenre,
&(pdmtai->pDeviceList));
if(FAILED(hRes))
{
// ISSUE-2001/03/29-timgill Needs error case handling
}
// free the existing mapping lists
dmtcfgFreeAllMappingLists(pdmtai->pGenreList);
// create the mapping lists within the subgenres
hRes = dmtcfgCreateAllMappingLists(pdmtai);
if(FAILED(hRes))
{
// ISSUE-2001/03/29-timgill Needs error case handling
}
// populate the devices control
pDevice = pdmtai->pDeviceList;
while(pDevice)
{
// add device name
nIdx = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
CB_ADDSTRING,
0,
(LPARAM)&(pDevice->szName));
// add device node to item data
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
CB_SETITEMDATA,
nIdx,
(LPARAM)pDevice);
// next device
pDevice = pDevice->pNext;
}
// select the 1st entry
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
CB_SETCURSEL,
0,
0L);
// enable appropriate ui elements
dimaptstPostEnumEnable(hwnd, TRUE);
break;
#ifdef TESTAPP
//***************************************
// Internal app specific message handling
//***************************************
case IDC_VERIFY_MANUAL:
case IDC_VERIFY_AUTOMATIC:
// enable/disable manual override option
fEnable = (BOOL)(IDC_VERIFY_MANUAL - dmtGetCheckedRadioButton(hwnd,
IDC_VERIFY_AUTOMATIC,
IDC_VERIFY_MANUAL));
EnableWindow(GetDlgItem(hwnd, IDC_VERIFY_MANUAL_OVERRIDE), fEnable);
break;
case IDC_STRESS_MODE:
// expand/shrink dialog
nHeight = IsDlgButtonChecked(hwnd, IDC_STRESS_MODE) ? 490 : 361;
SetWindowPos(hwnd,
HWND_TOP,
0, 0,
nWidth, nHeight,
SWP_NOMOVE | SWP_NOOWNERZORDER);
// enable / disable stress configuration & launch
fEnable = (BOOL)IsDlgButtonChecked(hwnd, IDC_STRESS_MODE);
// EnableWindow(GetDlgItem(hwnd, IDC_CONFIGURE), fEnable);
EnableWindow(GetDlgItem(hwnd, IDC_STRESS_START), fEnable);
break;
#endif // TESTAPP
#ifdef DDKAPP
case IDC_LAUNCH_CPL_EDIT_MODE:
// get the currently selected device?
nIdx = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
CB_GETCURSEL,
0,
0L);
if (nIdx == CB_ERR)
{
// Error has occurred. Most likely no device is available.
MessageBox(hwnd, "No device selected.", "Error", MB_OK);
return TRUE;
}
pDevice = (DMTDEVICE_NODE*)SendMessageA(GetDlgItem(hwnd,
IDC_DEVICE_LIST),
CB_GETITEMDATA,
nIdx,
0L);
if(!pDevice)
{
// ISSUE-2001/03/29-timgill Needs error case handling
}
// launch the mapper cpl in edit mode
hRes = dmttestRunMapperCPL(hwnd,
TRUE);
if(FAILED(hRes))
{
// ISSUE-2001/03/29-timgill Needs error case handling
}
break;
#endif // DDKAPP
}
// done
return FALSE;
} //*** end dimaptstOnCommand()
//===========================================================================
// dimaptstOnTimer
//
// Handles WM_TIMER messages for the main app dialog
//
// Parameters:
//
// Returns: BOOL
//
// History:
// 11/02/1999 - davidkl - created
//===========================================================================
BOOL dimaptstOnTimer(HWND hwnd,
WPARAM wparamTimerId)
{
//int nSel = -1;
//JJ 64Bit Compat
LONG_PTR nSel = -1;
DMTDEVICE_NODE *pDevice = NULL;
DPF(5, "dimaptstOnTimer - ID == %d",
wparamTimerId);
if(ID_POLL_TIMER == wparamTimerId)
{
// get the current device
nSel = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
CB_GETCURSEL,
0,
0L);
if(-1 == nSel)
{
DPF(0, "dimaptstOnTimer - invalid device selection");
return FALSE;
}
pDevice = (DMTDEVICE_NODE*)SendMessageA(GetDlgItem(hwnd,
IDC_DEVICE_LIST),
CB_GETITEMDATA,
nSel,
0L);
if(!pDevice)
{
DPF(0, "dimaptstOnTimer - failed to retrieve device node");
return FALSE;
}
// get data from the device
//JJ Removed
//dmttestGetInput(hwnd,
// pDevice);
}
// done
return FALSE;
} //*** end dimaptstOnTimer()
//===========================================================================
// dimaptstOnUpdateLists
//
// Updates the subgenre list in response to a genre bucket change
//
// NOTE: INTERNAL only - This also clears the devices list, frees
// all associated linked lists and performs some window enabling/disabling
// tasks.
//
// Parameters:
// HWND hwnd - handle to app window
//
// Returns: BOOL
//
// History:
// 10/01/1999 - davidkl - created
//===========================================================================
BOOL dimaptstOnUpdateLists(HWND hwnd)
{
//JJ 64Bit Compat
UINT_PTR uSel = 0;
DMTGENRE_NODE *pGenre = NULL;
DMTSUBGENRE_NODE *pSubNode = NULL;
DMT_APPINFO *pdmtai = NULL;
// get the genre bucket node
uSel = SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
CB_GETCURSEL,
0,
0L);
pGenre = (DMTGENRE_NODE*)SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_GENRES),
CB_GETITEMDATA,
uSel,
0L);
if(!pGenre)
{
// this is bad
DebugBreak();
return TRUE;
}
// clear the existing list contents
SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
CB_RESETCONTENT,
0,
0L);
// update (sub)genres list
pSubNode = pGenre->pSubGenreList;
while(pSubNode)
{
uSel = SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
CB_ADDSTRING,
0,
(LPARAM)(pSubNode->szName));
SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
CB_SETITEMDATA,
uSel,
(LPARAM)pSubNode);
// next subgenre
pSubNode = pSubNode->pNext;
}
// select the first list entry
SendMessageA(GetDlgItem(hwnd, IDC_SUBGENRES),
CB_SETCURSEL,
0,
0L);
#ifndef DDKAPP
//============================================
// only do this part for SDK and INTERNAL apps
//============================================
// get the device list
pdmtai = (DMT_APPINFO*)GetWindowLong(hwnd,
GWL_USERDATA);
if(!pdmtai)
{
// ISSUE-2001/03/29-timgill Needs error case handling
}
// clear the device combo box
SendMessageA(GetDlgItem(hwnd, IDC_DEVICE_LIST),
CB_RESETCONTENT,
0,
0L);
// release device list
dmtinputFreeDeviceList(&(pdmtai->pDeviceList));
// release the mapping lists for each subgenre
dmtcfgFreeAllMappingLists(pdmtai->pGenreList);
// disable appropriate controls
dimaptstPostEnumEnable(hwnd, FALSE);
#endif
// done
return FALSE;
} //*** end dimaptstOnUpdateLists()
//===========================================================================
// dmtGetCheckedRadioButton
//
// Returns the checked radio button in a group.
//
// Parameters:
//
// Returns:
//
// History:
// 08/25/1998 - davidkl - created (copied from dmcs sources)
//===========================================================================
UINT dmtGetCheckedRadioButton(HWND hWnd,
UINT uCtrlStart,
UINT uCtrlStop)
{
UINT uCurrent = 0;
for(uCurrent = uCtrlStart; uCurrent <= uCtrlStop; uCurrent++)
{
if(IsDlgButtonChecked(hWnd, uCurrent))
{
return uCurrent;
}
}
// if we get here, none were checked
return 0;
} //*** end dmtGetCheckedRadioButton()
//===========================================================================
// dimaptstPostEnumEnable
//
// Enables/disables main app UI elements in response to enumerating devices
//
// Parameters:
// HWND hwnd - main app window handle
// BOOL fEnable - enable or disable controls
//
// Returns: nothing
//
// History:
// 10/01/1999 - davidkl - created
//===========================================================================
void dimaptstPostEnumEnable(HWND hwnd,
BOOL fEnable)
{
UINT u = 0;
// devices list
EnableWindow(GetDlgItem(hwnd, IDC_DEVICES_LABEL), fEnable);
EnableWindow(GetDlgItem(hwnd, IDC_DEVICE_LIST), fEnable);
//JJ UI FIX
// test controls
//for(u = IDC_TEST_CTRL_GROUP; u <= IDC_USE_CPL; u++)
//{
// EnableWindow(GetDlgItem(hwnd, u), fEnable);
// }
// ISSUE-2000/02/21-timgill disable integration control and start button for the preview
// should be re-enabled once test mode code is fixed
// EnableWindow(GetDlgItem(hwnd, IDC_USE_INTEGRATED), FALSE);
// start button
// EnableWindow(GetDlgItem(hwnd, IDOK), fEnable);
#ifdef DDKAPP
// mapping file group
for(u = IDC_MAPPING_FILE_GROUP; u <= IDC_LAUNCH_CPL_EDIT_MODE; u++)
{
EnableWindow(GetDlgItem(hwnd, u), TRUE);
}
#else
#ifdef TESTAPP
// verification mode
for(u = IDC_VERIFY_GROUP; u <= IDC_VERIFY_MANUAL; u++)
{
EnableWindow(GetDlgItem(hwnd, u), TRUE);
}
// this will enable the manual overrride option as appropriate
SendMessageA(hwnd,
WM_COMMAND,
IDC_VERIFY_AUTOMATIC,
0L);
// this will enable the configuration button and
// expand the application window as appropriate
SendMessageA(hwnd,
WM_COMMAND,
IDC_STRESS_MODE,
0L);
#endif
#endif
} //*** end dimaptstPostEnumEnable()
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================
//===========================================================================