www.pudn.com > Chesssource.rar > Input.cpp
#include "stdafx.h"
///////////////////////////////////////////////////////////////////////
//
// cInput Class
//
///////////////////////////////////////////////////////////////////////
cInput::cInput()
{
m_pDI = NULL;
}
cInput::~cInput()
{
Shutdown();
}
HWND cInput::GethWnd()
{
return m_hWnd;
}
IDirectInput8 *cInput::GetDirectInputCOM()
{
return m_pDI;
}
BOOL cInput::Init(HWND hWnd, HINSTANCE hInst)
{
Shutdown();
m_hWnd = hWnd;
if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&m_pDI, NULL)))
return FALSE;
return TRUE;
}
BOOL cInput::Shutdown()
{
SAFE_RELEASE(m_pDI);
m_hWnd = NULL;
return TRUE;
}
///////////////////////////////////////////////////////////////////////
//
// cInputDevice Class
//
///////////////////////////////////////////////////////////////////////
cInputDevice::cInputDevice()
{
m_Input = NULL;
m_Type = NONE;
m_Windowed = TRUE;
m_pDIDevice = NULL;
m_MouseState = (DIMOUSESTATE*)&m_State;
Clear();
}
cInputDevice::~cInputDevice()
{
Free();
}
IDirectInputDevice8 *cInputDevice::DeviceCOM()
{
return m_pDIDevice;
}
BOOL cInputDevice::Create(cInput *Input, short Type, BOOL Windowed)
{
DIDATAFORMAT *DataFormat;
Free();
if((m_Input = Input) == NULL)
return FALSE;
// 创建设备
switch(Type)
{
case KEYBOARD:
if(FAILED(m_Input->GetDirectInputCOM()->CreateDevice(GUID_SysKeyboard, &m_pDIDevice, NULL)))
return FALSE;
DataFormat = (DIDATAFORMAT*)&c_dfDIKeyboard;
break;
case MOUSE:
if(FAILED(m_Input->GetDirectInputCOM()->CreateDevice(GUID_SysMouse, &m_pDIDevice, NULL)))
return FALSE;
DataFormat = (DIDATAFORMAT*)&c_dfDIMouse;
break;
default: return FALSE;
}
m_Windowed = Windowed;
// 设置键盘的数据格式
if(FAILED(m_pDIDevice->SetDataFormat(DataFormat)))
return FALSE;
// 设置协作级 - Foreground & Nonexclusive
if(FAILED(m_pDIDevice->SetCooperativeLevel(m_Input->GethWnd(), DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
return FALSE;
if(FAILED(m_pDIDevice->Acquire()))
return FALSE;
m_Type = Type;
Clear();
return FALSE;
}
BOOL cInputDevice::Free()
{
if(m_pDIDevice != NULL)
{
m_pDIDevice->Unacquire();
SAFE_RELEASE(m_pDIDevice);
}
m_Type = NONE;
Clear();
return TRUE;
}
BOOL cInputDevice::Clear()
{
short i;
ZeroMemory(&m_State, 256);
for(i=0;i<256;i++)
m_Locks[i] = FALSE;
m_XPos = 0;
m_YPos = 0;
return TRUE;
}
BOOL cInputDevice::Read()
{
HRESULT hr;
long BufferSizes[2] = { 256, sizeof(DIMOUSESTATE) };
short i;
if(m_pDIDevice == NULL)
return FALSE;
if(m_Type < 1 || m_Type > 2)
return FALSE;
while(1)
{
m_pDIDevice->Poll();
if(SUCCEEDED(hr = m_pDIDevice->GetDeviceState(BufferSizes[m_Type-1], (LPVOID)&m_State)))
break;
if(hr != DIERR_INPUTLOST && hr != DIERR_NOTACQUIRED)
return FALSE;
if(FAILED(m_pDIDevice->Acquire()))
return FALSE;
}
if(m_Type == MOUSE)
{
if(m_Windowed == TRUE)
{
POINT pt;
GetCursorPos(&pt);
ScreenToClient(m_Input->GethWnd(), &pt);
m_XPos = pt.x;
m_YPos = pt.y;
}
else
{
m_XPos += m_MouseState->lX;
m_YPos += m_MouseState->lY;
}
}
switch(m_Type)
{
case KEYBOARD:
for(i=0;i<256;i++)
{
if(!(m_State[i] & 0x80))
m_Locks[i] = FALSE;
}
break;
case MOUSE:
for(i=0;i<4;i++)
{
if(!(m_MouseState->rgbButtons[i]))
m_Locks[i] = FALSE;
}
break;
}
return TRUE;
}
BOOL cInputDevice::Acquire(BOOL Active)
{
if(m_pDIDevice == NULL)
return FALSE;
if(Active == TRUE)
m_pDIDevice->Acquire();
else
m_pDIDevice->Unacquire();
return TRUE;
}
BOOL cInputDevice::GetLock(char Num)
{
return m_Locks[Num];
}
BOOL cInputDevice::SetLock(char Num, BOOL State)
{
m_Locks[Num] = State;
return TRUE;
}
long cInputDevice::GetXPos()
{
return m_XPos;
}
BOOL cInputDevice::SetXPos(long XPos)
{
m_XPos = XPos;
return TRUE;
}
long cInputDevice::GetYPos()
{
return m_YPos;
}
BOOL cInputDevice::SetYPos(long YPos)
{
m_YPos = YPos;
return TRUE;
}
long cInputDevice::GetXDelta()
{
switch(m_Type)
{
case MOUSE:
return m_MouseState->lX;
default: return 0;
}
}
long cInputDevice::GetYDelta()
{
switch(m_Type)
{
case MOUSE:
return m_MouseState->lY;
default: return 0;
}
}
BOOL cInputDevice::GetKeyState(char Num)
{
if(m_State[Num] & 0x80 && m_Locks[Num] == FALSE)
return TRUE;
return FALSE;
}
BOOL cInputDevice::SetKeyState(char Num, BOOL State)
{
m_State[Num] = State;
return TRUE;
}
BOOL cInputDevice::GetPureKeyState(char Num)
{
return ((m_State[Num] & 0x80) ? TRUE : FALSE);
}
short cInputDevice::GetKeypress(long TimeOut)
{
static HKL KeyboardLayout = GetKeyboardLayout(0);
unsigned char WinKeyStates[256], DIKeyStates[256];
unsigned short i, ScanCode, VirtualKey, Keys, Num;
unsigned long EndTime;
// 确定它是键盘与已初始化
if((m_Type != KEYBOARD) || (m_pDIDevice == NULL))
return 0;
EndTime = GetTickCount() + TimeOut;
while(1)
{
// 得到Windows键盘状态
GetKeyboardState(WinKeyStates);
// 得到DirectInput键盘状态
m_pDIDevice->GetDeviceState(256, DIKeyStates);
// 检查所有的按键状态
for(i=0;i<256;i++)
{
// 如果有一个找到,尝试转换它
if(DIKeyStates[i] & 0x80)
{
// 得到虚键码
if((VirtualKey = MapVirtualKeyEx((ScanCode = i), 1, KeyboardLayout)))
{
// 得到ASCII码然后返回它
Num = ToAsciiEx(VirtualKey, ScanCode, WinKeyStates, &Keys, 0, KeyboardLayout);
if(Num)
return Keys;
}
}
}
if(TimeOut)
{
if(GetTickCount() > EndTime)
return 0;
}
}
return 0;
}
long cInputDevice::GetNumKeyPresses()
{
long i, Num = 0;
for(i=0;i<256;i++)
{
if(m_State[i] & 0x80 && m_Locks[i] == FALSE)
Num++;
}
return Num;
}
long cInputDevice::GetNumPureKeyPresses()
{
long i, Num = 0;
for(i=0;i<256;i++)
{
if(m_State[i] & 0x80)
Num++;
}
return Num;
}
BOOL cInputDevice::GetButtonState(char Num)
{
char State = 0;
if(m_Type == MOUSE)
State = m_MouseState->rgbButtons[Num];
// 检查如果有键按下
if(State & 0x80 && m_Locks[Num] == FALSE)
return TRUE;
return FALSE;
}
BOOL cInputDevice::SetButtonState(char Num, BOOL State)
{
if(m_Type == MOUSE)
{
m_MouseState->rgbButtons[Num] = State;
return TRUE;
}
return FALSE;
}
BOOL cInputDevice::GetPureButtonState(char Num)
{
if(m_Type == MOUSE)
return m_MouseState->rgbButtons[Num];
return FALSE;
}
long cInputDevice::GetNumButtonPresses()
{
long i, Num = 0;
if(m_Type == MOUSE)
{
for(i=0;i<4;i++)
{
if(m_MouseState->rgbButtons[i] & 0x80 && m_Locks[i] == FALSE)
Num++;
}
}
return Num;
}
long cInputDevice::GetNumPureButtonPresses()
{
long i, Num = 0;
if(m_Type == MOUSE)
{
for(i=0;i<4;i++)
{
if(m_MouseState->rgbButtons[i] & 0x80)
Num++;
}
}
return Num;
}