对于扫描的设备类型,在DirectInput8.0以上的版本主要有以下几种选择,你可以讲这些选择或(OR)起来进行你所需要的组合: #define DI8DEVCLASS_ALL 0 扫描所有设备 其他的一些信息请参考SDK,这里我们传递给枚举设备函数DI8DEVCLASS_GAMECTRL,用来识别我们的游戏手柄。 参数lpCallback为回调函数的函数名,这样枚举函数就知道如何去通过Windows来调用函数,做出相应的处理了。pvRef为32位的指针,来返回信息值。注意它的类型为LPVOID,所以你可以自定义任意的一个数据结构,然后传递这个结构的指针给枚举函数。在回调函数中,这个指针也将作为一个参数传递过去,然后你可以在回调函数中对这个指针指向的数据结构进行修改或其他的操作,来完成你所要完成的任务。 dwFlags控制枚举函数如何扫描,是扫描所有设备,还是扫描安装和连接好的设备,还是扫描力反馈设备。dwFlags的取值如下: #define DIEDFL_ALLDEVICES 0x00000000 //扫描所有设备 这里我们选择扫描安装和连接好的设备DIEDFL_ATTACHEDONLY 。最后的代码如下: hr = m_lpDI->EnumDevices( DI8DEVCLASS_GAMECTRL, DIEnumDevicesCallback为回调函数的函数名,在回调函数中,我们将传递JoystickGUID 的地址过去,然后把检测到的游戏手柄的GUID保存下来,为我们以后申请COM对象、创建设备做准备。 下面我们把回调的成员函数完成: BOOL CALLBACK Joystick::DIEnumDevicesCallback(const DIDEVICEINSTANCE* lpddi, VOID* pvRef) 别看这个函数仅仅几行,要注意的东西可不少。首先,在声明中我们将它声明为静态成员函数。使用了static关键字。静态成员函数与普通的成员函数的最大的区别就在于,这个函数不属于任何一个实际的对象,而是属于整个类的。如果你对C++很熟悉的话,这个并不难理解。想想枚举回调的原理,系统或者说你定义的类枚举到每一个设备,自动调用回调函数来处理,这里回调函数并不属于任何一个最后你所定义的对象,而属于系统。如果在一般的Win32程序中,回调函数一般是声明成一个全局的函数,然后任意调用的,那里将不需要任何static声明。 接下来是BOOL,在dinput.h中,BOOL有如下的定义: typedef BOOL (FAR PASCAL*LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW,LPVOID); //Unicode下 所以你得用BOOL来作为函数的返回值。 |
正在阅读:MFC下DirectX DirectInput的实现MFC下DirectX DirectInput的实现
2005-07-27 10:07
出处:
责任编辑:moningfeng
键盘也能翻页,试试“← →”键