快速业务通道

在C++ Builder中使用游戏操纵杆

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
最大值 */

    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.***件中,所以程序要包含这个头文件。

程序需要首先检查游戏操纵杆的存在,这包括了检查驱动程序支持和确认操纵杆已与系统相连的两项工作。joyGetNumDevs调用检查系统是否配置了游戏端口和驱动程序。如果返回值为零,表明不支持操纵杆功能。如果joyGetNumDevs返回值不为零,则说明系统支持游戏操纵杆功能。但joyGetNumDevs并不能确定操纵杆是否已被连接上了,通过调用可以完成这些工作,并检查是否有错误发生。

如果有游戏端口,joyGetNumDevs返回值通常为16.

一旦确认了操纵杆已连上,就可以接受器发来的消息。joySetCapture通知Windows操纵杆消息应发送到哪里机发送的频率如何。

joySetCapture中的第一个参数通知Windows谁将得到消息,第二个参数确定程序将从那个操纵杆接收消息。第三个参数时表示希望以怎样的频度接受JM_MOVE消息(单位为毫秒),无论操纵杆是否移动,都将以这个频度接受JM_MOVE消息。joySetCapture的四个参数允许程序当操纵杆移动一定的距离后才接受消息。该距离由joySetThreshold设置。

joySetCapture被调用后,窗口将接受操纵杆事件。MM_JOYXMOVE(X=操纵杆号)事件已joySetCapture定义的时间间隔发生。只有当操纵杆的按钮被按下时,MM_JOYXBUTTONUP和MM_JOYXBUTTONDOWN事件才发生。操纵杆时间出发句柄,改变相应的标签状态信息。移动消息也同时通知程序在新的位置重画操纵杆标志。调用joyReleaseCapture通知Windows已结束操纵杆的调用。

在实际编制程序时,应首先在Form1的头文件Form1.h中加入对mmsystem.h的引用,再加入一些相关的消息映射即对MM_JOYXMOVE、MM_JOYXBUTTONUP和MM_JOYXBUTTONDOWN事件的响应函数说明。

#include <mmsystem.h>

//--------------------

class Tform1:public TForm

{

__published:

...

...

private:

...

TPoint Position;//用于存储操纵杆的坐标位置。

...

public:

MESSAGE_HANDLER(MM_JOY1BUTTONDOWN,TMessage,JMButonUpdate)

MESSAGE_HANDLER(MM_JOY1BUTTONUP,TMessage,JMButonUpdate)

MESSAGE_HANDLER(MM_JOY1MOVE,TMessage,JMMove)

END_MESSAGE_MAP(TForm)

};

在Form1的OnCreate事件中加入以下代码用以检测操纵杆。

void __fastcall TForm1::FormCreate(TObject *Sender)

{

  DriverCount = joyGetNumDevs();

  Connected = false;

  MMRESULT  JoyResult;

  JOYINFO JoyInfo;

  //检查系统是否配置了游戏端口和驱动程序。

  if(DriverCount != 0)

  {

   //仍需调用joyGetPos进行检测,如果返回JOYERR_NOERROR则表示操纵杆连接正常。

    //测试第一个操纵杆。

    JoyResult = joyGetPos(JOYSTICKID1,&JoyInfo);

   if(JoyResult == JOYERR

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号