在Windows环境下通过编程来操纵鼠标、键盘是一件再简单不过的事了,不过大家有没有想过要尝试一下另一样我们比较常见的输入工具——游戏操纵杆呢?在某些情况下,尤其是象编制一些小型的游戏软件的时候,加入对游戏操纵杆的支持可以给使用者提供更为友好的人机界面,极大的提高游戏软件的可玩性。
C++Builder中没有专门控制操纵杆函数(其实在常见的编程语言中基本上都没有),因此要增加对游戏操纵杆的支持,就要和Windows的MCI API函数打交道,这里我们首先介绍一些在读取操纵杆的属性、状态,位置和按钮信息时要用到的API函数、常量及数据结构。
相关常量:
#define MM_JOY1MOVE 0x3A0 /* 用以传递操纵杆当前状态的一些消息 */ #define MM_JOY2MOVE 0x3A1 #define MM_JOY1ZMOVE 0x3A2 #define MM_JOY2ZMOVE 0x3A3 #define MM_JOY1BUTTONDOWN 0x3B5 #define MM_JOY2BUTTONDOWN 0x3B6 #define MM_JOY1BUTTONUP 0x3B7 #define MM_JOY2BUTTONUP 0x3B8 #define JOY_BUTTON1 0x0001 /* 用以表明当前操纵杆的状态 */ #define JOY_BUTTON2 0x0002 #define JOY_BUTTON3 0x0004 #define JOY_BUTTON4 0x0008 #define JOY_BUTTON1CHG 0x0100 #define JOY_BUTTON2CHG 0x0200 #define JOY_BUTTON3CHG 0x0400 #define JOY_BUTTON4CHG 0x0800 /* 游戏操纵杆错误返回值 */ #define JOYERR_BASE 160 #define JOYERR_NOERROR (0) /* 正常 */ #define JOYERR_ParmS (JOYERR_BASE+5) /* 参数错误 */ #define JOYERR_NOCANDO (JOYERR_BASE+6) /* 无法正常工作 */ #define JOYERR_UNPLUGGED (JOYERR_BASE+7) /* 操纵杆未连接 */ /* 操纵杆标识号 */ #define JOYSTICKID1 0 #define JOYSTICKID2 1
|
相关函数:
WINMMAPI UINT WINAPI joyGetNumDevs(void);
获取设备标识号。
MMRESULT WINAPI joyGetDevCaps(UINT uJoyID, LPJOYCAPS pjc, UINT cbjc);
获取操纵杆属性信息,以结构体JoyCaps接收。
WINMMAPI MMRESULT WINAPI joyGetPos(UINT uJoyID, LPJOYINFO pji);
获取操纵杆位置和按钮状态,以结构体接收。
WINMMAPI MMRESULT WINAPI joyGetThreshold(UINT uJoyID, LPUINT puThreshold);
读取操纵杆移动阈值。
WINMMAPI MMRESULT WINAPI joyReleaseCapture(UINT uJoyID);
结束对操纵杆信息的接收。
WINMMAPI MMRESULT WINAPI joySetCapture(HWND hwnd, UINT uJoyID, UINT uPeriod,
BOOL fChanged);
设置接收某一操纵杆的信息的窗口以及将何种频度接收。
WINMMAPI MMRESULT WINAPI joySetThreshold(UINT uJoyID, UINT uThreshold);
设置操纵杆移动阈值。
相关结构体:
typedef struct joyCaps{ WORD wMid; /* 制造商标识 */ WORD wPid; /* 生产编号 */ char szPname[MAXPNAMELEN]; /* 产品名称 */ UINT wXmin; /* X轴最小值 */ UINT wXmax; /* X轴最大值 */ UINT wYmin; /* Y轴最小值 */ UINT wYmax; /* Y轴最大值 */ UINT wZmin; /* Z轴最小值 */ UINT wZmax; /* Z轴最大值 */ UINT wNumButtons; /* 按钮数 */ UINT wPeriodMin; /* 最小调用间隔时间(单位 毫秒)*/ UINT wPeriodMax; /* 最大调用间隔时间(单位 毫秒)*/ }JOYCAPS, *PJOYCAPS, NEAR *NPJOYCAPS, FAR *LPJOYCAPS;
typedef struct joyInfo{ UINT wXpos; /* x 轴位置 */ UINT wYpos; /* y 轴位置 */ UINT wZpos; /* z 轴位置 */ UINT wButtons; /* 按钮状态 */ } JOYINFO, *PJOYINFO, NEAR *NPJOYINFO, FAR *LPJOYINFO; |
以上这些定义存储在mmsystem.h文件中,所以程序要包含这个头文件。