MFC识别XBox游戏手柄,并进行UI界面开发

发布于:2023-01-20 ⋅ 阅读:(387) ⋅ 点赞:(0)

一、效果展示

        直接上效果图:

二、利用XInput实现获取XBox游戏手柄数据

        在网上搜寻了很久,发现方法可以对游戏手柄进行测试,但是MFC版本以及完全版的很少有比较完全的资料,因此作为新手的我,正在攻克这方面,写的不足请多包含!

  1.  首先我实验的版本是如图所示的游戏手柄:

  2. 开始读取游戏手柄的数据,在.cpp文件中创建一个线程,代码如下:
    //读取游戏手柄的线程
    UINT _cdecl CMFC_GameHandle2Dlg::ReadJoystickThread(LPVOID lpParm)
    {
    	CMFC_GameHandle2Dlg *dlg = (CMFC_GameHandle2Dlg*)lpParm;
    	XINPUT_GAMEPAD gamepad;
    	CString temp;
    
        //识别游戏手柄是否插入,并读取数据
    	while (XInputGetState(0,&(dlg->m_ControllerState)) == ERROR_SUCCESS )
    	{
    		LastLxDataLX = LxDataLX;
    		LastLxDataLY = LxDataLY;
    
    		LastLxDataRX = LxDataRX;
    		LastLxDataRY = LxDataRY;
    
    		gamepad = dlg->m_ControllerState.Gamepad;
            
            //上下左右按键
    		(gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) ? (dlg->IsPressed_upT()): (dlg->IsPressed_upF());
    		(gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) ? (dlg->IsPressed_downT()): (dlg->IsPressed_downF());
    		(gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT)?(dlg->IsPressed_leftT()): (dlg->IsPressed_leftF());
    		(gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT)?(dlg->IsPressed_rightT()): (dlg->IsPressed_rightF());
    		(gamepad.wButtons & XINPUT_GAMEPAD_START)?(dlg->IsPressed_StartT()):(dlg->IsPressed_StartF());
    		(gamepad.wButtons & XINPUT_GAMEPAD_BACK)?(dlg->IsPressed_BackT()):(dlg->IsPressed_BackF());
    		(gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER)?(dlg->IsPressed_RLT()):(dlg->IsPressed_RLF());
    		(gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER)?(dlg->IsPressed_RRT()):(dlg->IsPressed_RRF());
    		if(gamepad.wButtons & XINPUT_GAMEPAD_A)
    		{
    			dlg->IsPressed_AT();
    		}
    		else
    		{
    			dlg->IsPressed_AF();
    		}
    		(gamepad.wButtons & XINPUT_GAMEPAD_B)?(dlg->IsPressed_BT()):(dlg->IsPressed_BF());
    		(gamepad.wButtons & XINPUT_GAMEPAD_X)?(dlg->IsPressed_XT()):(dlg->IsPressed_XF());
    		(gamepad.wButtons & XINPUT_GAMEPAD_Y)?(dlg->IsPressed_YT()):(dlg->IsPressed_YF());
    
            //TZ轴,也是就是游戏手柄最上的两个按钮
    		{
    			LxDataTZ  =(gamepad.bRightTrigger)/1.7-(gamepad.bLeftTrigger)/1.7+360;
    
    
    			dlg->DrawGradientColor1(210,LxDataTZ);
    
    
    			dlg->ClearDrawGradientColor(510,LxDataTZ);
    		}
    
    		//摇杆
    		{
    			{
    				LxDataLX = gamepad.sThumbLX/345 + 150;			
    				LxDataLY = (-gamepad.sThumbLY)/345 + 525;    //gamepad.sThumbLY:32767
    
    				LxDataRX = gamepad.sThumbRX/345 + 400;			
    				LxDataRY = (-gamepad.sThumbRY)/345 + 525;
    
    				if(LxDataRX > 500 && LxDataRY > 625 )
    				{
    					LxDataRX = 470;
    					LxDataRY = 620;
    				}
    				if(LxDataRX < 0 && LxDataRY < 0)
    				{
    					LxDataRX = 400;
    					LxDataRY = 525;
    				}
    
    				dlg->ClearSmartEclise(LastLxDataLX ,LastLxDataLY);	  //150,525
    				dlg->ClearSmartEclise(LastLxDataRX ,LastLxDataRY);	 //400,525 
    
    				dlg->SetSmartEclise(LxDataLX  ,LxDataLY );	    //75,525
    				dlg->SetSmartEclise(LxDataRX ,LxDataRY);	    //400,525			
    				
    			} 
    		}
    	}
    	return 0;
    }
  3. A、X、Y、B等一些按键我是通过重绘CButton类进行贴图按钮
     

三、 附带注意事项

1、在.h文件中需要添加一些条件:

#include "resource.h"		// 主符号
#include <XInput.h>
#include "afxwin.h"
#pragma comment(lib, "XInput.lib")  //添加依赖库

 2、因为我这边采取的是直接按照我的页面进行的数值设置,所以一些需要进行数值微型调整!

四、附带代码下载

(1条消息) MFC识别XBox游戏手柄,并进行UI界面开发-单片机文档类资源-CSDN文库