一般来说DirectX技术总是应用在游戏上的,而在DirectX天生就能与Win32很好的结合。看看市面上的图书,凡是用到DirectX技术的大多是使用Win32编程的,因为DirectDraw或者DirectXGraphics需要自己控制屏幕上的每一个象素,MFC等类库显然不适合太多自定义的东西。而另一方面,对于DirectInput里的内容,因为并不需要控制窗体,仅仅需要发送控制消息,则可以实现在MFC下的DirectInput编程。 下面简要说明一下一个DirectInput在MFC下的实现,其中也包括DirectInput的一些基础知识。
1.简介
DirectInput和其他DirectX组成部分一样,是通过硬件抽象层(HAL)和硬件仿真层(HEL)来实现,但是一般来说,所有的游戏控制器都有合适的驱动程序来支持,所以一般来说硬件仿真层的内容并不多,大多数的控制是通过DirectX调用驱动程序来完成的。
DirectInput处理的输入设备一般包括鼠标、键盘、游戏控制杆、操作杆等。而且现在的DirectInput还能够支持力反馈设备。本文仅仅讲述如何实现一个普通的PS游戏控制手柄在MFC中的应用,因为所有的输入设备的实现一般都大同小异,具体的力反馈设备,可以在SDK中查询。
2.组件
DirectInput8.0版中包括很多COM接口,而最主要的接口有两个:
IDirectInput8:启动DirectInput所必须创建的主COM接口。创建了这个接口,才可以创建其他的接口,设置DirectInput属性,创建或者获得想要的输入设备。
IDirectInputDevice8:由IDirectInput8接口创建而的,表示具体的输入设备。
3.实现
创建一个基于对话框的MFC应用程序。项目名称为DirectInputJS(JS表示joystick)其他使用默认设置。删除对话框中间的标签,按钮可以先不管,因为这不是本文的重点。
现在在解决方案中添加一个一般 C++类,来封装DirectInput 中的Joystick。类名填选Joystick,没有基类,虚析构函数,完成。
首先,在Joystick.h的头文件里补充一些声明:
#pragma once
#define DIRECTINPUT_VERSION 0x0800
#include <dinput.h> 注意声明版本在声明dinput.h头文件之前,因为如果先声明dinput.h,则这里的版本定义将因为dinput.h中已经声明而产生错误。这里需要说明的是SDK版本为DirectX9.0,而DirectInput版本为8.0。
需要说明的是,这里的版本定义并不是必须的,只是编译器会产生一个没什么影响的警告。在dinput.h里有这么一段代码:
#define DIRECTINPUT_HEADER_VERSION 0x0800
#ifndef DIRECTINPUT_VERSION
#define DIRECTINPUT_VERSION DIRECTINPUT_HEADER_VERSION
#pragma message(__FILE__ ": DIRECTINPUT_VERSION undefined. Defaulting to version 0x0800")
#endif
|