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;
Tags:MFC DirectX DirectInput
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接