решение поставленной задачи найдено: я думаю что проблема заключалась в более новой версии директ икса поэтому пред идущий пример не работал. во всяком случае привожу пример удачной реализации инициализации джойстика средствами DirectX9.0 в С++: | Код |
LPDIRECTINPUTDEVICE8 InitJoy(HWND hWnd, IDirectInput8* pDI) { LPDIRECTINPUTDEVICE8 pDIDevice=NULL; HRESULT hr; g_pDI->EnumDevices(DI8DEVTYPE_JOYSTICK, EnumJoysticks, NULL, DIEDFL_ATTACHEDONLY); if(g_pDIDJoystick == NULL) {/*MB(L"g_pDIDJoystick null InitInput ");*/b_usejoy=false;}else{b_usejoy=true;} if(!b_usejoy)return null;
// Устанавливаем формат данных if(FAILED(g_pDIDJoystick->SetDataFormat(&c_dfDIJoystick2))) { g_pDIDJoystick->Release(); g_pDIDJoystick = NULL; MB(L"g_pDIDJoystick DIENUM_CONTINUE SetDataFormat"); return NULL; }
// Устанавливаем уровень кооперации if(FAILED(g_pDIDJoystick->SetCooperativeLevel(g_hWnd, DISCL_EXCLUSIVE|DISCL_FOREGROUND))) {//NON g_pDIDJoystick->Release(); g_pDIDJoystick = NULL; MB(L"g_pDIDJoystick DIENUM_CONTINUE SetCooperativeLevel"); return NULL; } if(g_pDIDJoystick==NULL)MB(L"g_pDIDJoystick null DIJOFS_X"); // return DIENUM_STOP; if( FAILED( hr = g_pDIDJoystick->EnumObjects( EnumObjectsCallback1, (VOID*)g_hWnd, DIDFT_ALL ) ) ){ g_pDIDJoystick->Release(); g_pDIDJoystick = NULL; MB(L"g_pDIDJoystick EnumObjects"); return NULL; }
/**/ return g_pDIDJoystick; }
|
функция перечисления устройств: | Код |
//------------------for joy BOOL CALLBACK EnumJoysticks(LPCDIDEVICEINSTANCE pdInst, LPVOID pvRef) { int Result; /**/ // Отображаем окно сообщений с именем найденного устройства Result = MessageBox(g_hWnd, pdInst->tszInstanceName, L"Джойстик найден применить?", MB_OKCANCEL); // Продолжаем перечисление, если нажата кнопка OK if(Result == IDCANCEL) return DIENUM_CONTINUE; //-----------------------*/ g_pDIDJoystick = NULL;
//Создаем объект устройства, используя глобальный объект DirectInput if(FAILED(g_pDI->CreateDevice(pdInst->guidInstance, &g_pDIDJoystick, NULL))){ MB(L"g_pDIDJoystick DIENUM_CONTINUE CreateDevice"); return DIENUM_CONTINUE; }
return DIENUM_STOP; }
|
функция перечисления свойств устройства: | Код | BOOL CALLBACK EnumObjectsCallback1( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext ) { HWND hDlg = (HWND)pContext;
static int nSliderCount = 0; // Number of returned slider controls static int nPOVCount = 0; // Number of returned POV controls
// For axes that are returned, set the DIPROP_RANGE property for the // enumerated axis in order to scale min/max values. if( pdidoi->dwType & DIDFT_AXIS ) { DIPROPRANGE diprg; diprg.diph.dwSize = sizeof(DIPROPRANGE); diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER); diprg.diph.dwHow = DIPH_BYID; diprg.diph.dwObj = pdidoi->dwType; // Specify the enumerated axis diprg.lMin = -1000; diprg.lMax = +1000; // Set the range for the axis if( FAILED( g_pDIDJoystick->SetProperty( DIPROP_RANGE, &diprg.diph ) ) ) {MB(L"g_pDIDJoystick SetProperty DIENUM_STOP "); return DIENUM_STOP; } DIPROPDWORD dipdw1; dipdw1.diph.dwSize = sizeof(DIPROPDWORD); dipdw1.diph.dwHeaderSize = sizeof(DIPROPHEADER); dipdw1.diph.dwHow = DIPH_BYID; dipdw1.diph.dwObj = pdidoi->dwType; // Specify the enumerated axis dipdw1.dwData = 1500; // Приблизительно 15% диапазона
if(FAILED(g_pDIDJoystick->SetProperty(DIPROP_DEADZONE, &dipdw1.diph))) { g_pDIDJoystick->Release(); g_pDIDJoystick = NULL; MB(L"g_pDIDJoystick DIENUM_CONTINUE DIPROP_DEADZONE dwType"); return NULL; } }
return DIENUM_CONTINUE; }
|
в данном примере свойства джойстика устанавливаются в функции перечисления свойств устройства вызываемой из функции перечисления устройств пример рабочий если в системе установлено более одного джойстика то есть возможность выбрать более подходящий ps: MB-MessageBox Это сообщение отредактировал(а) Nick007 - 14.5.2010, 13:36
|