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; 
}