正在阅读:MFC下DirectX DirectInput的实现MFC下DirectX DirectInput的实现

2005-07-27 10:07 出处: 作者:苗苗 责任编辑:moningfeng

  下面定义bool Joystick::Initialise(void )函数。这个函数的目的是进行类的初始化,为了简单起见,我们把所有的必要的设置都放在初始化里面。这样在外部定义一个类以后,我们只使用一个初始化函数就完成所有的设置。

  首先定义一个HRESULT hr做为一些设置的返回值。

  HRESULT hr;


  然后建立DirectInput接口

//建立DI8接口

if(NULL == m_lpDI)

{

hr = DirectInput8Create(m_hInstance,

DIRECTINPUT_VERSION,

IID_IDirectInput8,

(void**)&m_lpDI, //接口取值

NULL);

if FAILED(hr)

{

OutputDebugString("Create 失败 - in CDIJoystick::Initialise\n");

return false;

}

}


  唯一需要说明的函数是DirectInput8Create(…)。先来看一下函数在dinput.h中的定义:

HRESULT WINAPI DirectInput8Create(

HINSTANCE hinst, //程序的主实例

DWORD dwVersion, //DirectInput版本

REFIID riidltf, //IID的引用

LPVOID *ppvOut, //接口取值,这个指针是保存接口的,所以双指针类型。

LPUNKNOWN punkOuter //系统保留,一般为NULL

);


  这里首先需要讲解的是IID。在微软的COM编程里,每一个COM对象以及接口都必须有一个128位的标识符,用户可以通过这个标识符来申请对象或者接口。对于对象,这个标识符称为GUID(Globally Unique Identifiers,全局唯一标识符)。对于接口,这个标识符称为IID(Interface ID,接口标识符)。

  对于上面的DirectInput8Create 函数,我们只需要传递IID_IDirectInput8常量给函数就可以。这个常量是在dinput.h中定义的。其中,程序是否支持UNICODE,IID_IDirectInput8的值是不同的,不过我们不需要考虑这些。

  另外的一个参数LPVOID *ppvOut是保存接口的指针。我们把成员变量m_lpDI赋值进去,这样就可以把接口保存下来。

  punkOuter是系统保留的参数,一般设置为NULL就可以了。

  hr保存了函数返回的信息,可以使用FAILED()或者SUCCEEDED()宏来判断是否成功。

  OutputDebugString(…)可以用来在调试栏里输出信息,便于以后的调试。

  接下来我们需要枚举(Enumeration)设备。枚举设备是游戏手柄特有的部分。它使用了一个回调函数,对于每一个检测到的设备,调用回调函数来处理相关的信息。说简单点,比如现在你的系统上有二三个游戏手柄设备,那么枚举函数可以依次检测这些设备,或者检测到一个就停止。检测到以后,Windows调用回调函数来处理这个设备的信息,比如你可以设置一个数据结构来保存所有的设备信息,或者其他你所希望的处理。一般来说,你应该在回调函数中处理设备的GUID,这样你才可以通过这个GUID来创建游戏手柄设备。枚举函数的原型为:

  HRESULT EnumDevices(

  DWORD dwDevType , //扫描的设备类型

  LPDIENUMCALLBACK lpCallback , //指向回调函数的指针

  LPVOID pvRef , //32位指针,用来存储你所需要的信息,这个指针将传递给回调函数

  DWORD dwFlags //枚举扫描的控制标志

  ) ;

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品