我们把整个的对象传递到回调函数里,枚举方式选择DIDFT_ALL。然后在枚举对象函数里设置对象的属性。
BOOL CALLBACK Joystick::EnumObjectsCallback( const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* pContext )
{
HRESULT hr;
CJoystick * js = (CJoystick*)pContext; //首先取得JS对象指针
//设置游戏杆输入特性
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; // 枚举的轴
diprg.lMin = -1024; //最小值
diprg.lMax = +1024; //最大值
// 设置轴范围
hr = js->m_lpDIDevice->SetProperty( DIPROP_RANGE, &diprg.diph);
if( FAILED(hr))
{
OutputDebugString("设置轴范围失败 - in CDIJoystick::EnumObjectsCallback\n");
return DIENUM_STOP;
}
//设置死区属性,如果你使用的是电平式的游戏手柄,需要注释掉一下部分
DIPROPDWORD dipdw; //死区结构
dipdw.diph.dwSize = sizeof( dipdw );
dipdw.diph.dwHeaderSize = sizeof( dipdw.diph );
diprg.diph.dwObj = pdidoi->dwType; // 枚举的轴
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = 1000; //10%的死区
hr = js->m_lpDIDevice->SetProperty(DIPROP_DEADZONE, &dipdw.diph);
if( FAILED(hr))
{
OutputDebugString("设置死区失败 - in CDIJoystick::EnumObjectsCallback\n");
return DIENUM_STOP;
}
}
return DIENUM_CONTINUE;
} 回调函数首先得到类对象的指针,判断扫描到的对象类型。本例中只设置了轴的属性,其实也可以在枚举对象的回调函数中扫描方式使用DIDFT_AXIS标志,例子目的在于说明如何依次设置手柄的各个对象属性。后面的代码设置每个轴的范围在-1024~+1024,如果是游戏杆的话,那么还设置了10%的死区。回调函数的返回值有一下两种:
#define DIENUM_STOP 0 //停止扫描
#define DIENUM_CONTINUE 1 //继续扫描 注意如果你使用的游戏手柄,一定要注释掉设置死区的部分,因为如果仍然对手柄设置死区,那么不会成功,回调函数就会返回DIENUM_STOP,后面也不会再枚举对象,所以有的轴并没有设置成功。甚至,在初始化的函数里,因为hr的错误代码导致初始化函数Initialise()返回了false,以后的代码将因此而失效。
|