WEB开发网
开发学院软件开发VC MFC下DirectX DirectInput的实现 阅读

MFC下DirectX DirectInput的实现

 2007-03-22 21:31:38 来源:WEB开发网   
核心提示: 下面我们把回调的成员函数完成:BOOL CALLBACK Joystick::DIEnumDevicesCallback(const DIDEVICEINSTANCE* lpddi, VOID* pvRef){*(GUID*) pvRef = lpddi->guidInstance;

下面我们把回调的成员函数完成:

  BOOL CALLBACK Joystick::DIEnumDevicesCallback(const DIDEVICEINSTANCE* lpddi, VOID* pvRef)
  
{
  
*(GUID*) pvRef = lpddi->guidInstance;
  
return DIENUM_STOP;
  
}

别看这个函数仅仅几行,要注意的东西可不少。首先,在声明中我们将它声明为静态成员函数。使用了static关键字。静态成员函数与普通的成员函数的最大的区别就在于,这个函数不属于任何一个实际的对象,而是属于整个类的。如果你对C++很熟悉的话,这个并不难理解。想想枚举回调的原理,系统或者说你定义的类枚举到每一个设备,自动调用回调函数来处理,这里回调函数并不属于任何一个最后你所定义的对象,而属于系统。如果在一般的Win32程序中,回调函数一般是声明成一个全局的函数,然后任意调用的,那里将不需要任何static声明。

接下来是BOOL,在dinput.h中,BOOL有如下的定义:

  typedef BOOL (FAR PASCAL*LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW,LPVOID); //Unicode下

所以你得用BOOL来作为函数的返回值。

下面要说明的是一个数据结构DIDEVICEINSTANCE,它的Unicode下5.0以上版本的定义如下:

  typedef struct DIDEVICEINSTANCEW {
  
DWORD dwSize; //结构大小
  
GUID guidInstance; //设备的GUID实例,这个是我们所需要的
  
GUID guidProduct; //设备产品的GUID
  
DWORD dwDevType; //扫描的设备类型,和枚举函数中定义的一样
  
WCHAR tszInstanceName[MAX_PATH]; //实例名称字符串
  
WCHAR tszProductName[MAX_PATH]; //产品名称字符串
  
GUID guidFFDriver; //力反馈驱动GUID
  
WORD wUsagePage; //高级参数
  
WORD wUsage; //高级参数
  
} DIDEVICEINSTANCEW, *LPDIDEVICEINSTANCEW;

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:MFC DirectX DirectInput

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接