📄 setcontrol.cpp
字号:
//--------------------------------------------------------------
/**\!File
*
*File name:SETCONTROL.CPP
*
*His:add by honghaier @2004/5/7
*
*Desc:设置游戏控制类
*/
//---------------------------------------------------------------
#include "SetControl.h"
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
//---------------------------------------------------------------
/** 构造函数.
* 初始化成员变量
*/
CSetControl::CSetControl()
{
m_type=1;
m_lpDI=NULL; /*对应的DINPUT对象 */
m_lpDIDevice=NULL ;/*创建的设备对象 */
m_Log.Settype(1);
//------------初始化键盘一----------
m_control.iUpKey=17;//'W'
m_control.iLeftKey=30;//'A'
m_control.iRightKey=32;//'D'
m_control.iDownKey=31;//'S'
m_control.iEndKey=18;//'E'
//------------初始化键盘二----------
m_control2.iUpKey=200;//'UP'
m_control2.iLeftKey=203;//'LEFT'
m_control2.iRightKey=205;//'RIGHT'
m_control2.iDownKey=208;//'DOWN'
m_control2.iEndKey=207;//'END'
}
/** 析构函数.
* 初始化成员变量
*/
CSetControl::~CSetControl()
{ if(m_lpDIDevice)
m_lpDIDevice->Unacquire();
SAFE_RELEASE(m_lpDIDevice);
SAFE_RELEASE(m_lpDI);
}
/**!\brief
*初始化键盘设备
*\param hWnd代表主窗口
*\return 如果成功返回true,否则false
*/
bool CSetControl::initKeyboard(HWND hWnd)
{
//---------------创建DINPUT对象-------------------
hr = DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
IID_IDirectInput8, (void**)&m_lpDI, NULL);
if FAILED(hr)
{
m_Log.Write("无法创建DINPUT对象(键盘)");
CleanUpDirectInput();
return false;
}
m_Log.Write("创建DINPUT对象成功(键盘)");
//----------------创建DINPUT设备------------------
hr=m_lpDI->CreateDevice(GUID_SysKeyboard,&m_lpDIDevice, NULL);
if FAILED(hr)
{
m_Log.Write("无法创建DINPUT设备(键盘)");
CleanUpDirectInput();
return false;
}
m_Log.Write("创建DINPUT设备成功(键盘)");
//-----------------设定数据格式-----------------
hr=m_lpDIDevice->SetDataFormat(&c_dfDIKeyboard);
if FAILED(hr)
{
m_Log.Write("无法设定数据格式(键盘)");
CleanUpDirectInput();
return false;
}
m_Log.Write("设定数据格式成功(键盘)");
//-----------------设定程序协调层级-----------------
hr=m_lpDIDevice->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
if FAILED(hr)
{
m_Log.Write("无法设定程序协调层级(键盘)");
CleanUpDirectInput();
return false;
}
m_Log.Write("设定程序协调层级成功(键盘)");
//-------------------取用输入装置----------------
hr=m_lpDIDevice->Acquire();
if FAILED(hr)
{
m_Log.Write("取用输入装置失败(键盘)");
CleanUpDirectInput();
return false;
}
m_Log.Write("取用输入装置成功(键盘)");
return true;
}
/**!\brief
*键盘数据处理
*\return 返回键盘值
*/
int CSetControl::ProcessKBInput()
{
char buffer[256];
//-------------------取用输入状态----------------
hr=m_lpDIDevice->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
if FAILED(hr)
{
m_Log.Write("取用输入状态失败(键盘)");
CleanUpDirectInput();
}
int t_key=0;
for(int i=0;i<255;i++)
{
if(buffer[i]&0x80)
{
t_key=i;
break;
}
}
DoKeyName(t_key);
return t_key;
}
/**!\brief
*清空资源
*/
void CSetControl::CleanUpDirectInput()
{ if(m_lpDIDevice)
m_lpDIDevice->Unacquire();
SAFE_RELEASE(m_lpDIDevice);
SAFE_RELEASE(m_lpDI);
}
/**!\brief
*对应键盘名称
*/
char *CSetControl::DoKeyName(int _i)
{
switch(_i)
{
//--------------第一排---------------
case 16:
wsprintf(m_info,"DIK_Q");
break;
case 17:
wsprintf(m_info,"DIK_W");
break;
case 18:
wsprintf(m_info,"DIK_E");
break;
case 19:
wsprintf(m_info,"DIK_R");
break;
case 20:
wsprintf(m_info,"DIK_T");
break;
case 21:
wsprintf(m_info,"DIK_Y");
break;
case 22:
wsprintf(m_info,"DIK_U");
break;
case 23:
wsprintf(m_info,"DIK_I");
break;
case 24:
wsprintf(m_info,"DIK_O");
break;
case 25:
wsprintf(m_info,"DIK_P");
break;
//--------------第二排---------------
case 30:
wsprintf(m_info,"DIK_A");
break;
case 31:
wsprintf(m_info,"DIK_S");
break;
case 32:
wsprintf(m_info,"DIK_D");
break;
case 33:
wsprintf(m_info,"DIK_F");
break;
case 34:
wsprintf(m_info,"DIK_G");
break;
case 35:
wsprintf(m_info,"DIK_H");
break;
case 36:
wsprintf(m_info,"DIK_J");
break;
case 37:
wsprintf(m_info,"DIK_K");
break;
case 38:
wsprintf(m_info,"DIK_L");
break;
//--------------第三排---------------
case 44:
wsprintf(m_info,"DIK_Z");
break;
case 45:
wsprintf(m_info,"DIK_X");
break;
case 46:
wsprintf(m_info,"DIK_C");
break;
case 47:
wsprintf(m_info,"DIK_V");
break;
case 48:
wsprintf(m_info,"DIK_B");
break;
case 49:
wsprintf(m_info,"DIK_N");
break;
case 50:
wsprintf(m_info,"DIK_M");
break;
//--------------小键盘---------------
case 71:
wsprintf(m_info,"DIK_NUMPAD7");
break;
case 72:
wsprintf(m_info,"DIK_NUMPAD8");
break;
case 73:
wsprintf(m_info,"DIK_NUMPAD9");
break;
case 74:
wsprintf(m_info,"DIK_SUBTRACT");
break;
case 75:
wsprintf(m_info,"DIK_NUMPAD4");
break;
case 76:
wsprintf(m_info,"DIK_NUMPAD5");
break;
case 77:
wsprintf(m_info,"DIK_NUMPAD6");
break;
case 78:
wsprintf(m_info,"DIK_ADD");
break;
case 79:
wsprintf(m_info,"DIK_NUMPAD1");
break;
case 80:
wsprintf(m_info,"DIK_NUMPAD2");
break;
case 81:
wsprintf(m_info,"DIK_NUMPAD3");
break;
case 82:
wsprintf(m_info,"DIK_NUMPAD0");
break;
case 83:
wsprintf(m_info,"DIK_DECIMAL");
break;
//--------------控制键---------------
case 199:
wsprintf(m_info,"DIK_HOME");
break;
case 200:
wsprintf(m_info,"DIK_UP");
break;
case 201:
wsprintf(m_info,"DIK_RPIOR");
break;
case 203:
wsprintf(m_info,"DIK_LEFT");
break;
case 205:
wsprintf(m_info,"DIK_RIGHT");
break;
case 207:
wsprintf(m_info,"DIK_END");
break;
case 208:
wsprintf(m_info,"DIK_DOWN");
break;
case 209:
wsprintf(m_info,"DIK_NEXT");
break;
case 210:
wsprintf(m_info,"DIK_INSERT");
break;
case 211:
wsprintf(m_info,"DIK_DELETE");
break;
}
return &m_info[0];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -